[英]Chaining multiple data.table::merge operations with data.tables
[英]Merge 2 data.tables with more than one column the data.table way
我有两个data.table
s 如下:-
a <- data.table(id = 1:10, val = 2010:2019)
b <- data.table(id = c(1, 2, 4, 6), year = 1:4)
现在,如果我将b
和a
合并如下:-
b[a, val := i.val, on = "id"]
这将在b
创建一个名为val
的额外列。 这也不会为b
data.table
重新分配内存。
我想知道,如果a
超过2列,是如下: -
a <- data.table(id = 1:10, val = 2010:2019,
twr = c(10, 13, 22 ,43, 23, 23, -4, 33, -54, 34))
如何合并两个data.table
s( b
和a
), data.table
方式,即不使用merge
或任何join
函数。
但是使用[, , on = "id"]
语法。
我想知道这一点,因为使用任何join
函数或merge
都会创建一个全新的对象,而data.table
方式只创建新列而不是一个全新的对象。
提前致谢。
如果只有两列要返回,只需on
通过 'id' 加入后用list
(或短格式.(
) 包装,然后将:=
)这些列分配给 'b'
b[a, names(a)[-1] := .(i.val, i.twr), on = .(id)]
如果要返回的列很多
nm1 <- names(a)[-1]
b[a, (nm1) := mget(paste0("i.", nm1)), on = .(id)]
-输出
b
id year val twr
1: 1 1 2010 10
2: 2 2 2011 13
3: 4 3 2013 43
4: 6 4 2015 23
在开发版本 1.14.1 中, data.table获得了env
参数,用于在 data.table 上进行编程:
cols <- setdiff(names(a), "id")
b[a, on = "id", (cols) := acols, env = list(acols = as.list(cols))][]
id year val twr 1: 1 1 2010 10 2: 2 2 2011 13 3: 4 3 2013 43 4: 6 4 2015 23
这在许多情况下都有效,其中a
和b
除了要加入的列名之外没有重复的列名。 但是,我们可以通过使用前缀i.
来显式地引用a
的列i.
:
b[a, on = "id", (cols) := acols, env = list(acols = as.list(paste0("i.", cols)))][]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.