【问题标题】:using diff and cumsum in R在 R 中使用 diff 和 cumsum
【发布时间】:2020-05-14 16:10:34
【问题描述】:

我一直在尝试使用this question 中提供的解决方案,但由于某种原因它无法正常工作。

基本上,我想找到至少有 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吗?
  • This solution from @Akrun 似乎适用于您的数据。我用底部的“紧凑”版本对其进行了测试。
  • 我认为链接帖子中选择的解决方案缺少第二个[ 中的另一个分组变量。您将需要setDT(mydata)[, grp := cumsum(c(0, diff(year))!=1L), ID][, if (.N &gt;= 4) .SD, .(ID, grp)][mydata[mydata[, if (.N &gt;= 4L) .I, .(ID, cumsum(c(0L, diff(year)!=1L)))]$V1]mydata &lt;- data.table(ID, year) 在没有cbindas.numeric 的情况下工作得很好

标签: r data.table diff cumsum


【解决方案1】:

以下是使用data.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

【讨论】:

  • 这正是我一直在寻找的...唯一的问题是,如果我只想保留过去 3 年的内容,也适用于 4 年以上的 ID,该怎么办?怎么可能呢?又名 4 年数据,丢弃 0,5 年丢弃 0 和 1 等等。
  • 我试过 mydata2 = max(year - K)), by = ID] 但出现错误
猜你喜欢
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
相关资源
最近更新 更多