分享

R:分组练习题

 zjinm 2017-09-08


练习题

今天看到交流群里有人问:对于每个id1和id2,想生成一列status2,将status1里的最后一个1保留,其余1变成0,。原本就是0的保持不变。




方法一:SQL语言处理

mydata<-data.frame(id1=numeric(0),id2=numeric(0),status1=numeric(0),time=numeric(0))#输入数据

fix(mydata)#编辑数据源

library(sqldf)#使用sqldf包处理数据

maxdata<-sqldf("select id1,id2,status1,max(time) as 'time' from mydata group by id1,id2,status1")#选出最后一行

maxdata$status2<-maxdata$status1#status2保留原样status1

#选出其他数据集,status2赋值为0

otherdata<-sqldf("select a.id1,a.id2,a.status1,a.time from mydata as a left join maxdata as b on (a.id1=b.id1 and a.id2=b.id2 and a.status1=b.status1 and a.time=b.time) where b.id1 is null")

otherdata$status2<-0

#合并两个数据集,即为结果

newmydata<-rbind(otherdata,maxdata)

mydata;newmydata

运行结果如下:


方法二:另类的数据分组处理

mydata<-data.frame(id1=c(1,1,1,2,2,5,5,10,10,10,10),

                   id2=c(14,14,14,8,8,7,7,14,14,14,14),

                   status1=c(1,1,1,0,0,0,0,1,1,1,1),

                   time=c(0,1,2,0,1,0,1,0,1,2,3))

mydata$class=as.numeric(as.factor(paste(mydata$id1,mydata$id2)))

mydata$diff=ifelse(c(diff(mydata$class),1)==0,0,1)

mydata$status2=mydata$status1*mydata$diff

mydata

运行结果如下:


方法三:数据分组处理

id1 <- c( 1,1,1,2,2,5,5,10,10,10,10) 

id2 <- c( 14,14,14,8,8,7,7,14,14,14,14)

status1 <- c( 1,1,1,0,0,0,0,1,1,1,1)

time <- c( 0,1,2,0,1,0,1,0,1,2,3)

mydata<-data.frame(id1,id2,status1,time)

mydata_max<-aggregate(time~id1+id2+status1,mydata,max)

mydata_max<-cbind(mydata_max,status2=mydata_max$status1)

mydata_new<-merge(mydata,mydata_max,all = TRUE)

mydata_new[is.na(mydata_new)]=0

mydata_new

运行结果如下:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多