首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >data.table中滞后组的匹配

data.table中滞后组的匹配
EN

Stack Overflow用户
提问于 2017-06-22 21:40:19
回答 2查看 104关注 0票数 6

我正在尝试创建一个新列,该列指示一个ID是否存在于前一个组中。这是我的数据:

代码语言:javascript
运行
复制
data <- data.table(ID = c(1:3, c(9,2,3,4),c(5,1)),
                   groups = c(rep(c("a", "b", "c"), c(3, 4,2))))
   ID groups
1:  1      a
2:  2      a
3:  3      a
4:  9      b
5:  2      b
6:  3      b
7:  4      b
8:  5      c
9:  1      c

我不知道如何指定滞后组。我试过使用shift,但它不起作用:

代码语言:javascript
运行
复制
data[,.(ID=ID,match_lagged=ID %in% shift(ID)),by=groups]

这是我想要的结果。

前3行不匹配,因为没有前面的组。FALSE也适用于这三行。ID=4 ( b组)不匹配于a组,ID=5 (C组)不匹配于B组。

注意,组c中的ID 1在组b中不匹配,所以即使它存在于组a中,它也应该是假的。这就是为什么duplicated(data$ID)不能工作。来自一个组的数据必须与上一个组匹配。

代码语言:javascript
运行
复制
groups ID match_lagged
1:      a  1         NA
2:      a  2         NA
3:      a  3         NA
4:      b  9         FALSE
5:      b  2         TRUE
6:      b  3         TRUE
7:      b  4         FALSE
8:      c  5         FALSE
9:      c  1         FALSE

dplyr解决方案也可以工作。

EN

Stack Overflow用户

发布于 2017-06-26 21:00:54

对组进行编号,然后检查diff对于每个ID是否等于一个。

代码语言:javascript
运行
复制
data[, grp.id := .GRP, by = groups]
data[, match_lagged := c(FALSE, diff(grp.id) == 1), by = ID][
     grp.id == 1, match_lagged := NA][]
#   ID groups grp.id match_lagged
#1:  1      a      1           NA
#2:  2      a      1           NA
#3:  3      a      1           NA
#4:  9      b      2        FALSE
#5:  2      b      2         TRUE
#6:  3      b      2         TRUE
#7:  4      b      2        FALSE
#8:  5      c      3        FALSE
#9:  1      c      3        FALSE

这假设您只在每个组中找到每个ID一次。如果不是这种情况,您可以唯一,做上面的,然后合并。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44709809

复制
相关文章

相似问题

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