首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >data.table -在R中过滤按ID分组的行

data.table -在R中过滤按ID分组的行
EN

Stack Overflow用户
提问于 2020-05-15 16:45:24
回答 1查看 69关注 0票数 0

所以我有数据:

代码语言:javascript
复制
# 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)

对于这些数据,我已经找出了哪些i至少有三年的连续历史:

代码语言:javascript
复制
mydata2 <- mydata[, grp := cumsum(c(0, diff(year)==1)), by = ID][,max_grp := max(grp), by=ID][max_grp>=2]

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

代码语言:javascript
复制
mydata2 <- mydata2[which(year >= max(year - 2)), by = ID]

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

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

基本上,我想过滤连续三年的in,如果它们连续三年以上,我只想保留三年。

有没有更好的方法来做这件事?这看起来不是很健壮,尽管我只有有限的经验

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-15 16:55:26

也许,您正在寻找以下内容:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61815246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档