【发布时间】:2017-04-25 09:54:53
【问题描述】:
我有 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]
但它不起作用。
感谢您对这个问题的帮助。 谢谢你的时间。
【问题讨论】:
-
试试
split即..lapply(split(dt1, dt1$a.id), function(x) merge(x, dt2, by = "b.id", all = TRUE)) -
如果您打算使用
sample(),请使用set.seed。 -
感谢@akrun。这提供了一个快速的解决方案。但是,我们将 t 保留为 1 列,并获得 a.id 的 NA。但这不是一个大问题。
标签: r merge data.table