在 R data.table 中连接具有相同(非键控)列名的表

Z. *_*ble 4 join r data.table

加入data.tables 时如何处理同名的非键列?我正在寻找table.fieldSQL 中符号的解决方案。

例如,假设我有一个表 DT,v 每个时间段都会为列重新填充新数据。我还有一个表 DT_HIST,用于存储以前时间段 ( t) 的条目。我想找到每个时间段当前和上一个时间段之间的差异x

在这种情况下:DT是时间段3,DT_HIST有时间段1和2:

 DT <- data.table(x=c(1,2,3,4),v=c(20,20,35,30))
 setkey(DT,x)
 DT_HIST <- data.table(x=rep(seq(1,4,1),2),v=c(40,40,40,40,30,25,45,40),t=c(rep(1,4),rep(2,4)))
 setkey(DT_HIST,x)

> DT
   x  v
1: 1 20
2: 2 20
3: 3 35
4: 4 30

> DT_HIST
   x  v t
1: 1 40 1
2: 1 30 2
3: 2 40 1
4: 2 25 2
5: 3 40 1
6: 3 45 2
7: 4 40 1
8: 4 40 2
Run Code Online (Sandbox Code Playgroud)

我想加盟DTDT_HIST[t==1,]x和计算的差异v

只是加入表格结果列vv.1

> DT[DT_HIST[t==2],]
   x  v v.1 t
1: 1 20  30 2
2: 2 20  25 2
3: 3 35  45 2
4: 4 30  40 2
Run Code Online (Sandbox Code Playgroud)

但是,v在进行连接时我找不到引用不同列的方法。

> DT[DT_HIST[t==2],list(delta=v-v.1)]
Error in `[.data.table`(DT, DT_HIST[t == 2], list(delta = v - v.1)) : 
object 'v.1' not found

> DT[DT_HIST[t==2],list(delta=v-v)]
   x delta
1: 1     0
2: 2     0
3: 3     0
4: 4     0
Run Code Online (Sandbox Code Playgroud)

如果这是重复的,我深表歉意。我搜索并找不到类似的问题。

此外,我意识到我可以在加入后简单地重命名列,然后运行我想要的表达式,但我想知道我是否以完全错误的方式这样做。

edd*_*ddi 5

您可以使用i.colname访问i-expression 中的列data.table。我看到你使用的是旧data.table版本。从那以后发生了一些变化:重复的连接列名称有一个前缀i.而不是数字后缀(使其与i.连接列名称的访问更加一致,并且默认情况下不再有by-without-by。

在最新版本 (1.9.3) 中,您会得到以下内容:

DT[DT_HIST[t==2],list(delta = v - i.v)]
#   delta
#1:   -10
#2:    -5
#3:   -10
#4:   -10
Run Code Online (Sandbox Code Playgroud)