data.table中的`by`和`.EACHI`

时间:2017-12-27 09:47:23

标签: r data.table

a = data.table(id = c(1L, 1L, 2L, 3L, NA_integer_), t = c(1L, 2L, 1L, 2L, NA_integer_), x = 11:15)
b = data.table(id = 1:2, y = c(11L, 15L))

# > a
# id  t  x
# 1:  1  1 11
# 2:  1  2 12
# 3:  2  1 13
# 4:  3  2 14
# 5: NA NA 15

# > b
# id  y
# 1:  1 11
# 2:  2 15

a[b, on=.(id), sum(x), by = .(id)]
# > a[b, on=.(id), sum(x), by = .(id)]
# id V1
# 1:  1 23
# 2:  1 13

为什么上面的查询在第二行中没有返回id = 2,V1 = 13?尽管如此,我得到了我期望的by=.EACHI

a[b, on=.(id), sum(x), by = .EACHI]
# > a[b, on=.(id), sum(x), by = .EACHI]
# id V1
# 1:  1 23
# 2:  2 13

1 个答案:

答案 0 :(得分:4)

似乎在两个data.tables之间进行正确连接时,我们应该在连接的by=.EACHI参数中使用by,而不使用右表中的任何变量({{1因为他们不能在结果联合表中访问它们。这就是为什么第一个查询中的b无效。

如第3.5.3节http://franknarf1.github.io/r-tutorial/_book/tables.html

所述
  

注意DT [i,on =,j,by = bycols]。只是重复:只有= .EACHI才能工作   加入。通过=值键入其他将导致i的列成为   不可用

这个查询帮助我更好地理解了上述说法:

by = .id

a[b, .SD, on = .(id)] # id t x # 1: 1 1 11 # 2: 1 2 12 # 3: 2 1 13 无法在此b中访问id以外的.SD列。

我想这意味着在如上所述的连接中,by必须使用.EACHI或左表(此处为a)的列名,而不是连接变量名称(如上面的问题所示,id无法正常工作,即使它也在a中。因为使用a中的列名似乎可以正常工作:

a[b, sum(x), on = .(id), by = .(t)]
   t V1
1: 1 24
2: 2 12