我有两个包含许多字段的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我发现了一个功能请求:
这应该准确地满足您的需求.
它使用非常强大的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)
我更确定我对你问题第二部分的回答,所以我先回答一下.如果您只想说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)
但是,可能有更高效的代码来实现这一目标.
| 归档时间: |
|
| 查看次数: |
598 次 |
| 最近记录: |