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
答案 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