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