按组高效地重复观察
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
我正在尝试找到一种有效的方法来仅针对某些组在 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