R 使用data.table左连接
假设我有两个数据。表的: A: B: 我有以下代码:R 使用data.table左连接,r,merge,data.table,R,Merge,Data.table,假设我有两个数据。表的: A: B: 我有以下代码: merge_test = merge(dataA, dataB, by="A", all.data=TRUE) 我得到: A B.x B.y 1: 2 13 13 2: 3 14 14 但是,我希望dataA中的所有行都位于最终合并表中。有没有办法做到这一点?您可以尝试以下方法: # used data # set the key in 'B' to the column which you use to join A &l
merge_test = merge(dataA, dataB, by="A", all.data=TRUE)
我得到:
A B.x B.y
1: 2 13 13
2: 3 14 14
但是,我希望dataA中的所有行都位于最终合并表中。有没有办法做到这一点?您可以尝试以下方法:
# 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]
#已用数据
#将“B”中的键设置为用于联接的列
A如果您想将b
的b
值添加到A
,那么最好将A
与b
连接,并通过引用更新A
,如下所示:
A[B, on = 'a', bb := i.b]
其中:
这是一种比使用B[a,on='a']
更好的方法,因为后者只是将结果打印到控制台。当您想将结果返回到A
中时,您需要使用A为了完整起见,我将答案的版本添加到您的问题中table.express
很好地将tidyverse语言扩展到了data.table
中,使其成为快速处理大型数据集的便捷工具。以下是使用上述问题中的数据集的解决方案:
merge\u test=dataA%>%left\u加入(dataB,by=“A”)
left\u join
将所有来自连接数据集中dataA的行保留下来。搜索应该会产生一些涉及到这一点的问题。这里有一个:如果你想做一个左连接,你可以使用all.x=TRUE
。如果你想做一个完整的外部连接,你可以使用<代码> all=truth。从投票中判断,也许考虑改变接受的答案?很棒的答案。为了确认,我假设“A[B,bb:=I.B,on='A']”中的“I”指的是一般数据表“DT[I,j,by]”语法中的“I”?@cbailiss是的,I.B
意味着在使用联接更新A
时,它应该看B
-列。以类似的方式,使用x.
前缀,您可以引用a
@Jaap的列。当创建了多个新列时,您如何通过引用管理联接?这里创建了新的列bb:=i.b
,如您所述,它在b
数据中查找相应的b
列值。表对应于i
。但是,如果有许多新列可能是通过合并(通过引用)更大的数据而创建的,那么会发生什么呢question@Prevosttric正在使用mget
,另请参见上一篇评论链接下我答案的最后一部分。如果一个数据表键是另一个数据表键的子集,则此答案效果良好。如果它们部分相交,是否有可能连接?例如,如果A,B
类似于:A
# 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]
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
> address(A)
[1] "0x102afa5d0"
> A[B, on = 'a', bb := i.b]
> address(A)
[1] "0x102afa5d0"
> address(A)
[1] "0x102abae50"
> A <- B[A, on = 'a']
> address(A)
[1] "0x102aa7e30"
> address(A)
[1] "0x111897e00"
> A <- merge(A, B, by = 'a', all.x = TRUE)
> address(A)
[1] "0x1118ab000"
A[B, on = 'a', bb := i.b]
library(bench)
bm <- mark(AA <- BB[AA, on = .(aa)],
AA[BB, on = .(aa), cc := cc],
iterations = 1)
> bm[,c(1,3,5)]
# A tibble: 2 x 3
expression median mem_alloc
<bch:expr> <bch:tm> <bch:byt>
1 AA <- BB[AA, on = .(aa)] 4.98s 4.1GB
2 AA[BB, on = .(aa), `:=`(cc, cc)] 560.88ms 384.6MB
# initial datasets
A <- data.table(a = 1:4, b = 12:15)
B <- data.table(a = 2:3, b = 13:14)
# large datasets for the benchmark
set.seed(2019)
AA <- data.table(aa = 1:1e8, bb = sample(12:19, 1e7, TRUE))
BB <- data.table(aa = sample(AA$a, 2e5), cc = sample(2:8, 2e5, TRUE))