r - 递归地合并(完全连接)一个 data.table 与另一 data.table 的每一组

标签 r merge data.table

我有 2 个数据表:

a.id <- c("a","a","a","b","b","c","c","c","c")
b.id <- c(1,2,3,4,5,1,3,4,5)
x <- seq(1:9)
dt1 <- data.table(a.id,b.id,x)

rp <- c("r","s")
t <- rep(rp, each=5)
b.id <- rep(1:5, 2)
y <- sample.int(50, 10)
dt2 <- data.table(t, b.id, y)

对于dt1的每个a.id,我想完全连接dt2的每个t ,按列将它们添加到 dt1 中,并为列指定名称和 t 的值。由于这是完全连接,因此 dt1 中所有缺失的 x(b.id) 都将添加 NA

这是所需的输出(对于 r 和 s,这些是随机值):

 a.id    b.id    x     r     s
 a       1       1     14    40
 a       2       2     42    25
 a       3       3     32    11
 a       4       NA    33    3
 a       5       NA    21    1
 b       1       NA    14    40
 b       2       NA    42    25
 b       3       NA    32    11
 b       4       4     33    3
 b       5       5     21    1
 c       1       6     14    40
 c       2       NA    42    25
 c       3       7     32    11
 c       4       8     33    3
 c       5       9     21    1

我尝试过类似的方法:

dt1[, merge(.SD, dt2, by = "b.id", all = TRUE), by = a.id]

但是它不起作用。

非常感谢您对这个问题的帮助。 谢谢你的时间。

最佳答案

尝试如下:

f<-dcast(dt2,b.id~t)
dt1[f[rep(1:nrow(f),uniqueN(dt1$a.id)),
    c(.SD,list(a.id=rep(unique(dt1$a.id),each=nrow(f))))],on=c("a.id","b.id")]
#    a.id b.id  x  r  s
# 1:    a    1  1 40 28
# 2:    a    2  2  4 17
# 3:    a    3  3 11 13
# 4:    a    4 NA 49 42
# 5:    a    5 NA 29 37
# 6:    b    1 NA 40 28
# 7:    b    2 NA  4 17
# 8:    b    3 NA 11 13
# 9:    b    4  4 49 42
#10:    b    5  5 29 37
#11:    c    1  6 40 28
#12:    c    2 NA  4 17
#13:    c    3  7 11 13
#14:    c    4  8 49 42
#15:    c    5  9 29 37

结果有所不同,因为尚未设置种子

关于r - 递归地合并(完全连接)一个 data.table 与另一 data.table 的每一组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43607350/

相关文章:

r - 使用 R 中的列表导入 .CSV

R - 类似重复的函数,删除所有重复的实例

r - 使用数字名称调用对象

merge - TortoiseSvn "Show log"从合并窗口打开表示 "Invalid revision passed to Log()"

r - 如果每个数据集中的列具有不同的名称,如何将两个数据框合并到一列上?

r - 在 data.table 函数中将多个列名传递给 "by"

r - Shiny 的部署问题,卡在 : Uploading bundle for application: 413154

c - 我将如何合并这两个数组? C

r - 使用 := with j in data. 表(未实现功能的解决方法)

r - 根据上一行更改列值