R data.table join:连接表中的SQL"select*"类似语法?

R Y*_*oda 8 join r data.table

我有两个包含许多字段的data.tables.

我想加入这两个表,添加一些计算字段并附加第一个,第二个或两个表中的所有其他字段(类似于SQL select a+b AS sum, DT1.*, DT2.* FROM...)而不键入所有字段名称.

我该怎么做(关于最简单的语法和最佳性能)?

简化的示例数据:

library(data.table)
DT1 = data.table(x=c("c", "a", "b", "a", "b"), a=1:5)
DT2 = data.table(x=c("d", "c", "b"), b=6:8)
Run Code Online (Sandbox Code Playgroud)

现在我想加入表并添加一个计算字段:

DT1[DT2, .(sum=a + b, <<< how to say DT1.*, DT2.* here? >>> ), on="x"]
Run Code Online (Sandbox Code Playgroud)

2016年5月4日更新: 灵感来自用户jangorecki我发现了一个功能请求:

在加入期间应该可以参考我的.SD

jan*_*cki 9

这应该准确地满足您的需求.
它使用非常强大的R功能,称为计算语言(或元编程),在官方R语言定义手册中有详细描述.这是R语言的一个特殊功能,不应该忘记IMO.

library(data.table)
DT1 = data.table(x=c("c", "a", "b", "a", "b"), a=1:5)
DT2 = data.table(x=c("d", "c", "b"), b=6:8)

jj = as.call(c(
    list(as.name(".")),
    list(sum = quote(a+b)),
    lapply(unique(c(names(DT1), names(DT2))), as.name)
))
print(jj)
#.(sum = a + b, x, a, b)
DT1[DT2, eval(jj), on="x"]
#   sum x  a b
#1:  NA d NA 6
#2:   8 c  1 7
#3:  11 b  3 8
#4:  13 b  5 8
Run Code Online (Sandbox Code Playgroud)

  • 除了教育价值,不是这里的额外复杂的粉丝.@RYoda如果你可以输入`names(DT*)`,那么也可以这样做:`DT1 [DT2,c(list(sum = a + b),mget(union(names(DT1),names(DT2) )))),on ='x']`.目前没有对"i.SD"的支持,但有关于它的FR. (3认同)
  • 值得注意的是,`x.col`和`i.col`都适用于1.9.7,因此`as.name`可以使用前缀填充名称,从而完全控制使用的列 (2认同)

shr*_*sgm 5

我更确定我对你问题第二部分的回答,所以我先回答一下.如果您只想说DT1.*或DT2.*,但想要额外的列new = a + b,我会这样做:

DT1[DT2,new:=a+b,on="x"]
Run Code Online (Sandbox Code Playgroud)

对于第一部分,您需要DT1.*和DT2.*,我能想到的唯一答案是:

DT1[DT2, on="x"][,new := a+b]
Run Code Online (Sandbox Code Playgroud)

但是,可能有更高效的代码来实现这一目标.