在加入data.tables时,如何处理具有相同名称的非键列?我正在寻找SQL中table.field
符号的解决方案。
例如,假设我有一个表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
我想DT
加DT_HIST[t==1,]
加x
v
并计算v
的差异。
只需加入表格即可生成列v.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
。
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
列的方法。
{{1}}
如果这是重复,我道歉。我搜索过,找不到类似的问题。
此外,我意识到我可以在加入后简单地重命名列,然后运行我想要的表达式,但我想知道我是否以完全错误的方式执行此操作。
答案 0 :(得分:4)
您可以使用i.colname
访问i
- 表达式data.table
中的列。我看到您正在使用旧的data.table
版本。从那时起发生了一些变化:重复的连接列名称具有前缀i.
而不是数字后缀(使其与已连接列名称的i.
访问更加一致,并且没有 - 默认情况下不再使用。
在最新版本(1.9.3)中,您可以获得:
DT[DT_HIST[t==2],list(delta = v - i.v)]
# delta
#1: -10
#2: -5
#3: -10
#4: -10