按组高效地重复观察

Efficiently Repeating Observations by Group

我正在尝试找到一种有效的方法来仅针对某些组在 data.table 中按组重复行。请考虑以下示例:

library(data.table) 

DT <- data.table(x = c("A","A", "B", "B", "C","C", "D","D"),
                 y = 1:8)

这个数据集看起来像:

head(DT)
   x y
1: A 1
2: A 2
3: B 3
4: B 4
5: C 5
6: C 6

假设我有一个单独的向量 rep <- c("A", "A", "A", "B", "B", "C")。鉴于此向量,我希望能够将 A 的 all 行重复三次(由于 rep 中“A”字符的基数)以及与 B 关联的所有行两次。因此,最终的数据集应该是:

    x y
1:  A 1
2:  A 2
3:  A 1
4:  A 2
5:  A 1
6:  A 2
7:  B 3
8:  B 4
9:  B 3
10: B 4
11: C 5
12: C 6

注意,我没有重复“C”,因为“C”的基数在rep中只有1。目前,我有一种执行此过程的 hackish 方法,但我想知道是否有更有效的 data.table 方法来执行上述操作。

谢谢!

P.S。我这样做的原因是因为我在我的回归中进行了一些与替换的匹配,有时,同一控制公司被分配给多个处理公司。

我们可以做到

DT[ data.table(x = v1)[, .N, x], on = .(x)][rep(seq_len(.N), N)]

或按相同顺序return

 DT[, .(y = list(y)), x][data.table(x = v1), on = .(x)][, .(x, y = unlist(y))]

数据

v1 <- c("A", "A", "A", "B", "B", "C")

一个解决方案是收集计数并左连接到它们:

library(data.table) 
library(data.table)

DT <- data.table(x = c("A","A", "B", "B", "C","C", "D","D"),
                 y = 1:8)
rep_vec <- c("A", "A", "A", "B", "B", "C")
rep_DT <- DT %>% 
  left_join(data.frame(group = rep_vec), by = c("x" = "group"))

您确定在数据框中复制行是您的理想选择吗?

data.table 合并不会给您相同的排序,但无论如何您不应该依赖数据表中的排序:

merge(DT, data.frame(x=rep), by="x")

    x y
 1: A 1
 2: A 1
 3: A 1
 4: A 2
 5: A 2
 6: A 2
 7: B 3
 8: B 3
 9: B 4
10: B 4
11: C 5
12: C 6