在data.table中匹配滞后组

Pie*_*nte 6 r match matching dplyr data.table

我正在尝试创建一个新列,指示前一个组中是否存在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
Run Code Online (Sandbox Code Playgroud)

我不确定如何指定滞后组.我尝试使用shift,但它不起作用:

data[,.(ID=ID,match_lagged=ID %in% shift(ID)),by=groups]
Run Code Online (Sandbox Code Playgroud)

这是我想要的结果.

前3行不匹配,因为没有以前的组.FALSE也适用于这三行.ID = 4(在组b中)在组a中不匹配.ID = 5(在组c中)在组b中不匹配.

请注意,组c中的ID 1在组b中不匹配,因此即使它存在于组a中也应该为false.这就是为什么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         FALSE
Run Code Online (Sandbox Code Playgroud)

一个dplyr解决方案也将工作.

use*_*523 0

这有效。可能有一个更简单的解决方案:

data <- data.frame(ID = c(1:3, 1:4,c(5,1)),
                   groups = c(rep(c("a", "b", "c"), c(3, 4,2))))

z <- data %>% group_by(groups) %>% summarize(all_vals = list(ID))
z <- z %>% mutate(lagged_id = lag(all_vals,1))

match_lagged <- lapply(1:nrow(z) , function(x) {
  (z$all_vals[x] %>% unlist) %in% (z$lagged_id[x] %>% unlist)
})

data$match_lagged = match_lagged %>% unlist
Run Code Online (Sandbox Code Playgroud)