练习题
今天看到交流群里有人问:对于每个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
运行结果如下:
联系客服