在R中使用diff和cumsum

在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

我一直在尝试使用中提供的解决方案,但由于某些原因,它不起作用

基本上,我希望找到所有至少连续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))
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],但出现了一个错误