打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
R:分组练习题


练习题

今天看到交流群里有人问:对于每个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

运行结果如下:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Mybatis中进行批量更新(updateBatch)
reshape2 使用
Jquery中Ajax实现下拉列表联动(DataSet)(二)
Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
R 中计算数据框中相同ID的均值 标准差 和删除行(记录或者观测)中重复的数据
jqGrid 操作一些总结
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服