假设我有两个data.table:
A:
A B 1: 1 12 2: 2 13 3: 3 14 4: 4 15
B:
A B 1: 2 13 2: 3 14
我有以下代码:
merge_test = merge(dataA, dataB, by="A", all.data=TRUE)
我明白了:
A B.x B.y 1: 2 13 13 2: 3 14 14
但是,我想在最终合并表中的dataA中的所有行.有没有办法做到这一点?
如果你想添加b
的值B
到A
,那么最好加入A
与B
和更新A
引用如下:
A[B, on = 'a', bb := i.b]
这使:
> A a b bb 1: 1 12 NA 2: 2 13 13 3: 3 14 14 4: 4 15 NA
这是比使用更好的appraoch,B[A, on='a']
因为后者只是将结果打印到控制台.当你想要重新获得结果时A
,你需要使用A <- B[A, on='a']
哪个会给你相同的结果.
之所以A[B, on = 'a', bb := i.b]
比A <- B[A, on = 'a']
内存效率更好.随着A[B, on = 'a', bb := i.b]
位置A
在内存中保持不变:
> address(A) [1] "0x102afa5d0" > A[B, on = 'a', bb := i.b] > address(A) [1] "0x102afa5d0"
另一方面A <- B[A, on = 'a']
,创建一个新对象并将其保存在内存中A
,因此在内存中有另一个位置:
> address(A) [1] "0x102abae50" > A <- B[A, on = 'a'] > address(A) [1] "0x102aa7e30"
使用merge
(merge.data.table
)会导致内存位置发生类似的变化:
> address(A) [1] "0x111897e00" > A <- merge(A, B, by = 'a', all.x = TRUE) > address(A) [1] "0x1118ab000"
为了提高内存效率,最好使用'update-by-reference-join'语法:
A[B, on = 'a', bb := i.b]
虽然这对于像这样的小型数据集没有显着差异,但它确实对data.table
设计的大型数据集产生了影响.
可能还值得一提的是,A
保持顺序相同.
使用数据:
library(bench) bm <- mark(AA <- BB[AA, on = .(aa)], AA[BB, on = .(aa), cc := cc], iterations = 1)
你可以试试这个:
# used data # set the key in 'B' to the column which you use to join A <- data.table(a = 1:4, b = 12:15) B <- data.table(a = 2:3, b = 13:14, key = 'a') B[A]