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

4
当在数据表中连接具有相同名称的非关键列时,您该如何处理?我正在寻找 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

我希望能够在 x 上将 DT_HIST[t==1,]DT 进行连接,并计算 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

然而,我无法找到一种在进行连接时引用不同的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个回答

5
您可以使用 i.colname 来访问 data.table 中的列。我看到您正在使用旧版本的 data.table 。此后已经进行了一些更改:重复加入的列名具有前缀 i. 而不是数字后缀(这使其与加入的列名的 i. 访问更加一致),并且默认情况下不再按无by-by执行。

在最新版本(1.9.3)中,您将得到以下结果:

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

谢谢!也许这是一个新手问题,但为什么有更新的稳定版本不在CRAN上? - Z. Kimble
@Z.Kimble 这只是 data.table 的工作流程 - 奇数版本是开发版本,偶数版本更稳定并且会发布到 CRAN。 - eddi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接