在R中使用diff和cumsum

问题描述 投票:0回答:1

我一直在尝试使用在以下文件中提供的解决方案。这个问题然而,由于某些原因,它不能工作。

基本上,我想找到所有的ID,至少有4个 连续 年,只保留属于这些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][]
r data.table diff cumsum
1个回答
1
投票

下面是你如何做到这一点,你可以用 data.table. 基本上,你要确保先把表排序。其次,我使用的是 diff(year)==1. 我们希望连续几年,所以,重要的是。diff 正好等于1,以防止年份的跳跃。最后,我只保留最大(cumsum)为3或以上的ID(3不是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
© www.soinside.com 2019 - 2024. All rights reserved.