R 使用data.table左连接

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

假设我有两个数据。表的:

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 <- 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))