我正在尝试创建一个新列,该列指示一个ID是否存在于前一个组中。这是我的数据:
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,但它不起作用:
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)不能工作。来自一个组的数据必须与上一个组匹配。
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 FALSEdplyr解决方案也可以工作。
发布于 2017-06-26 21:00:54
对组进行编号,然后检查diff对于每个ID是否等于一个。
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一次。如果不是这种情况,您可以唯一,做上面的,然后合并。
https://stackoverflow.com/questions/44709809
复制相似问题