【问题标题】:Match in lagged group in data.table匹配 data.table 中的滞后组
【发布时间】:2017-06-22 21:40:19
【问题描述】:

我正在尝试创建一个新列,以指示上一个组中是否存在 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 组中,它也应该为 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

dplyr 解决方案也可以。

【问题讨论】:

  • duplicated(data$ID) 不起作用?
  • @d.b 不,一组中的数据应该与上一个组中的数据相匹配。我编辑了这个问题,以更清楚地说明为什么 duplicated 不起作用。

标签: r data.table dplyr match matching


【解决方案1】:

给组编号,然后检查每个IDdiff 是否等于一个。

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 一次。如果不是这种情况,您可以唯一,执行上述操作,然后合并。

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2012-07-09
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      相关资源
      最近更新 更多