在 R 中使用 diff 和 cumsum
using diff and cumsum in R
我一直在尝试使用 中提供的解决方案,但由于某种原因它不起作用。
基本上,我想找到所有至少有 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
的方法。基本上,您要确保首先对 table 进行排序。其次,我正在使用 diff(year)==1
。我们想要连续的年份,所以 diff
正好等于 1 以防止年份跳跃是很重要的。最后,我只保留 max(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
我一直在尝试使用
基本上,我想找到所有至少有 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
的方法。基本上,您要确保首先对 table 进行排序。其次,我正在使用 diff(year)==1
。我们想要连续的年份,所以 diff
正好等于 1 以防止年份跳跃是很重要的。最后,我只保留 max(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