【问题标题】:data.table - filtering rows grouped by ID in Rdata.table - 在 R 中过滤按 ID 分组的行
【发布时间】:2020-09-01 01:02:42
【问题描述】:

所以我有数据:

# 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)

对于这个数据,我发现哪些 ID 至少有连续三年的历史:

mydata2 <- mydata[, grp := cumsum(c(0, diff(year)==1)), by = ID][,max_grp := max(grp), by=ID][max_grp>=2]

现在,我只想为每个 ID 保留最近三年的数据:

mydata2 <- mydata2[which(year >= max(year - 2)), by = ID]

结果是正确的,但我在这里收到警告:

Warning message:
In `[.data.table`(mydata2, which(year >= max(year - 3)), by = ID) :
  Ignoring by= because j= is not supplied

基本上,我想过滤连续三年的 ID,如果它们的历史连续超过三年,我只想保留三年。

有没有更好的方法来做到这一点?这似乎不是很健壮,即使我只有有限的经验

【问题讨论】:

  • 试试mydata2 &lt;- mydata2[,which(year &gt;= max(year - 2)), by = ID],因为data.table 使用三个“参数”:DT[x,y,by=] 而您只提供了两个。

标签: r data.table lubridate


【解决方案1】:

也许,你正在寻找这个:

library(data.table)
mydata2[, .SD[year >= max(year) - 2], by = ID]

#    ID year grp max_grp
# 1:  A 2013   1       3
# 2:  A 2014   2       3
# 3:  A 2015   3       3
# 4:  B 2013   0       4
# 5:  B 2014   1       4
# 6:  B 2015   2       4
# 7:  B 2013   3       4
# 8:  B 2014   4       4
# 9:  D 2013   0       2
#10:  D 2014   1       2
#11:  D 2015   2       2
#12:  E 2015   1       2
#13:  E 2016   2       2

【讨论】:

  • 你能解释一下我的方法有什么问题吗?对于整体任务还有更好的解决方案吗?
  • 不是data.table 专家,但警告是因为您没有提供j th 参数。另外我认为by 不适用于i 组件。它适用于整个数据。
猜你喜欢
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2022-08-02
  • 2013-08-09
  • 2021-07-23
相关资源
最近更新 更多