楼主: complicated
4661 7

[问答] 数据框/矩阵的行操作 [推广有奖]

  • 3关注
  • 18粉丝

已卖:10份资源

副教授

65%

还不是VIP/贵宾

-

威望
0
论坛币
6463 个
通用积分
3868.8149
学术水平
88 点
热心指数
86 点
信用等级
58 点
经验
21958 点
帖子
506
精华
0
在线时间
1425 小时
注册时间
2007-6-16
最后登录
2024-4-20

楼主
complicated 在职认证  发表于 2014-6-4 11:38:07 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我的数据包含用户id,每个用户每周登陆的次数,以及用户在第几周流失(为流失则为Inf),如下id wk1 wk2 wk3 wk4 wk5 wk6 lost
c1 4 5 4 3 2 1 Inf
c2 5 4 3 2 1 0 6
c3 4 3 2 1 0 0 5
c4 5 2 1 4 0 0 4
希望从这里取出流失前3周的每周登陆数据,类似这样
id wkl3 wkl2 wkl1 lost
c1 3 2 1 Inf
c2 3 2 1 6
c3 3 2 1 5
c4 2 1 4 4

我现在的办法是两层循环,内层j in 1:3,外层按1:nrow跑一遍,代码不好看,效率极其低,求高效的思路啊
谢谢!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据框 Lost 数据包 用户

密码被盗??

沙发
yywan0913 在职认证  发表于 2014-6-4 12:01:19
先将inf    等价于7    然后中间三列就等于lost的前三周数据
是什么给了你自信

藤椅
马甲1号 发表于 2014-6-4 13:16:24
  1. testdata=data.frame(id=c('C1','C2','C3','C4'), wk1=c(4,5,4,5), wk2=c(5,4,3,2), wk3=c(4,3,2,1), wk4=c(3,2,1,4), wk5=c(2,1,0,0), wk6=c(1,0,0,0), lost=c(Inf, 6,5,4))
  2. library(reshape2)
  3. test.melt=melt(testdata[!is.infinite(testdata$lost),])
  4. temp=merge(test.melt[test.melt$variable!='lost',], test.melt[test.melt$variable=='lost',], by='id')
  5. temp$weeknum = as.numeric(gsub('wk','',temp$variable.x))
  6. temp = temp[temp$value.y-temp$weeknum < 4 & temp$value.y-temp$weeknum >=1,]
  7. temp$variable.z=paste('wkl', temp$value.y-temp$weeknum, sep='')
  8. dcast(temp[c('id','value.x','variable.z')], id~variable.z, value.var = 'value.x')
复制代码



有个问题是Inf的情况没处理.
ps: 论坛对美元号转义了?(latex的副作用)? 怎样禁用latex解析, 还原\$符号?
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
complicated + 36 + 36 + 3 + 3 + 3 热心帮助其他会员

总评分: 经验 + 36  论坛币 + 36  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

归欤!归欤!吾党之小子狂简,斐然成章,不知所以裁之。

板凳
yywan0913 在职认证  发表于 2014-6-4 13:43:07
  1. options(stringsAsFactors=F)
  2. x=data.frame(id=c("c1","c2","c3","c4"),wk1=c(4,5,4,5),wk2=5:2,wk3=4:1,wk4=c(3:1,4),wk5=c(2,1,0,0),wk6=c(1,0,0,0),lost=c(Inf,6,5,5))
  3. p=matrix(,nc=5,nr=4)
  4. p[,1]=x[,1];p[,5]=x[,8]
  5. colnames(p)=c("id","wkl3","wkl2","wkl1","lost")

  6. x[,8][grep("Inf",x[,8])]=7        #Inf  to   7
  7. t= mapply(":",x[,8]-3,x[,8]-1)   #lost前三周的周数  每列为每个id所选取的周数

  8. p[,2:4]=t(sapply(1:4,function(i) as.numeric(x[i,t[,i]+1])))   
  9. as.data.frame(p)
复制代码


我也来个
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
complicated + 36 + 36 + 3 + 3 + 3 热心帮助其他会员

总评分: 经验 + 36  论坛币 + 36  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

是什么给了你自信

报纸
complicated 在职认证  发表于 2014-6-4 14:07:35
马甲1号 发表于 2014-6-4 13:16
有个问题是Inf的情况没处理.
ps: 论坛对美元号转义了?(latex的副作用)? 怎样禁用latex解析, 还原\$符 ...
谢谢!代码没太看懂但是想法理解了,是melt,cast的办法吧?很有启发啊!
密码被盗??

地板
complicated 在职认证  发表于 2014-6-4 14:08:45
yywan0913 发表于 2014-6-4 13:43
我也来个
谢谢!
mapply。。。这个玩意我之前就没弄明白怎么回事,希望这次能看懂
密码被盗??

7
playmore 发表于 2014-6-4 14:14:03
首先,你这数据对每个id只有6周的数据?并且用户一旦流失(某个wk值为0)就再也不会回来了?

如果是的话,你的问题就简单了,我这里随便写了下,就是求每行第一次出现0的那个位置的前3个数,很简单
  1. for (i in 1:nrow(d)){
  2.   if (length(which(d[i,]==0)) > 0){
  3.     d$last1[i] <- d[i,which(d[i,]==0)-1]
  4.     d$last2[i] <- d[i,which(d[i,]==0)-2]  
  5.     d$last3[i] <- d[i,which(d[i,]==0)-3]
  6.   }
  7.   else{
  8.     d$last1[i] <- d[i,"wk6"]
  9.     d$last2[i] <- d[i,"wk5"]  
  10.     d$last3[i] <- d[i,"wk4"]   
  11.   }
  12. }
复制代码
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

8
complicated 在职认证  发表于 2014-6-4 14:21:33
playmore 发表于 2014-6-4 14:14
首先,你这数据对每个id只有6周的数据?并且用户一旦流失(某个wk值为0)就再也不会回来了?

如果是的话 ...
谢谢哈,
其实我的数据几十万行,有上百周(列),流失的判定是连续4周为0。。。。
所以我是求高效率计算的办法的,抱歉描述不够清楚
密码被盗??

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 05:17