在R中使用diff和cumsum
我一直在尝试使用中提供的解决方案,但由于某些原因,它不起作用 基本上,我希望找到所有至少连续4年的ID,并且只保留属于这些ID的行 有什么想法吗在R中使用diff和cumsum,r,data.table,diff,cumsum,R,Data.table,Diff,Cumsum,我一直在尝试使用中提供的解决方案,但由于某些原因,它不起作用 基本上,我希望找到所有至少连续4年的ID,并且只保留属于这些ID的行 有什么想法吗 # example data ID <- c(rep("A", 5), rep("B", 6), rep("C", 2), rep("D", 3), rep("E", 4)) year <- as.numeric(c(rep(c(2012, 2013, 2014, 2015), 4), 2012, 2013, 2015, 2016)) my
# example data
ID <- c(rep("A", 5), rep("B", 6), rep("C", 2), rep("D", 3), rep("E", 4))
year <- as.numeric(c(rep(c(2012, 2013, 2014, 2015), 4), 2012, 2013, 2015, 2016))
mydata <- cbind(ID, year)
mydata <- as.data.table(mydata)
mydata$year <- as.numeric(mydata$year)
# provided solution
mydata2 <- setDT(mydata)[, grp := cumsum(c(0, diff(year)) > 1), by = ID
][, if (.N > 4) .SD, by = grp][, grp := NULL][]
下面是如何使用data.table实现这一点。基本上,您希望确保首先对表进行排序。其次,我使用diffyear==1。我们想要连续几年,所以重要的是,差正好等于1,以防止在几年内跳跃。最后,我只保留maxcumsum为3或更多的ID,而不是4,因为我们从0开始计数
setorder(mydata)
mydata2 <- mydata[, grp := cumsum(c(0, diff(year)==1)), by = ID]
mydata2[,max_grp := max(grp), by=ID]
mydata2[max_grp>=3]
ID year grp max_grp
1: A 2012 0 3
2: A 2012 0 3
3: A 2013 1 3
4: A 2014 2 3
5: A 2015 3 3
6: B 2012 0 3
7: B 2013 1 3
8: B 2013 1 3
9: B 2014 2 3
10: B 2014 2 3
11: B 2015 3 3
是否希望解决方案使用data.table?似乎可以处理您的数据。我使用底部的压缩版本进行了测试。我认为链接帖子中选择的解决方案在第二个[,grp:=cumsumc0,diffyear!=1L,ID][,if.N>=4.SD,.ID,grp]中缺少另一个分组变量,或者在一个[:mydata[mydata[,if.N>=4L.I,.ID,cumsumc0L,diffyear!=1L]$V1]中需要设置mydata这正是我要寻找的…唯一的问题是,如果我只想保留过去3年,也要保留4年以上的ID,那该怎么办呢?也就是4年的数据,丢弃0,5年丢弃0和1等等。我尝试了mydata2=maxyear-K,by=ID],但出现了一个错误