参考 @Frank 的回答:
Which data.table syntax for left join (one column) to prefer,
以及 @Jaap 的回答:
left join using data.table。
我认为这对于真正寻找左连接并来到社区寻求答案的人来说是危险的领域。链接中提供的按引用更新示例(使用
:=
解决方案)实际上不是左连接。左连接返回左表中的所有记录和右表中匹配的记录,但我们正在讨论的这个
data.table
语法实际上并没有返回右表中所有匹配的记录,因此不是左连接。
data.table 文档清楚地说明了左连接是:
X[DT, on="x"]
将会产生正确的data.table,满足 OP 的需求:
test[test2, on="carb"]
test[test2[, wt2 := wt][,c("carb", "wt2")], on="carb"]
@Jaap在他的回答中解释了使用
:=
符号引用连接和常规左连接之间的区别:
虽然对于像这样的小数据集,这并没有什么明显的区别,但是对于data.table专门设计的大型数据集来说确实会有所不同。
我的看法是,这里有两个令人担忧的陈述。一个陈述认为确实有明显的差异-在结果上-因为使用这两种方法得到的结果是不同的(尽管我理解他谈论的是速度,
编辑:正如@jangorecki所指出的,这与速度无关,而与内存使用有关。通过引用更新不会在内存中创建第二个对象)。第二件事是假设(在我的眼中是尊重的),如果一个人在处理大型数据集,并且打算进行左连接,那么我从来没有见过任何不想要右表中所有匹配项的人。
我不知道如何在"data.table"中使用更新引用进行左连接。我的推理是,
:=
仅在j中定义(
data.table
语法)。它通过引用添加、更新或删除列。它根本不会复制任何内存的一部分。但由于我们可能需要向左侧表添加额外的行,如果我们在右侧表中获得多个匹配项(如果我们打算进行实际的左连接),所以我认为不能使用
:=
运算符,因为它仅作用于列。
test2[test, on = c(carb = "carb"), wt2 := i.wt]
吗? - AnilGoyal