R `通过data.table中的`and`.EACHI`

R `通过data.table中的`and`.EACHI`,r,data.table,R,Data.table,为什么上面的查询在第二行不返回id=2,V1=13?使用by=.EACHI我得到了我期望的结果,不过: 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

为什么上面的查询在第二行不返回id=2,V1=13?使用
by=.EACHI
我得到了我期望的结果,不过:

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

似乎在两个data.table之间进行右连接时,我们应该在连接的
by
参数中使用
by=.EACHI
,而不要使用右表中的任何变量(
b
),因为它们在生成的连接表中不可访问。这就是为什么第一个查询中的
by=.id
不起作用的原因

如第3.5.3节所述

注意DT[i,on=,j,by=bycols]。重复一次:只有by=。EACHI在 加入。在那里键入other by=值将导致i的列变为 不可用

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

a[b, on=.(id), sum(x), by = .EACHI]
# > a[b, on=.(id), sum(x), by = .EACHI]
# id V1
# 1:  1 23
# 2:  2 13
除了
id
之外,
b
中的列在此联接的
.SD
中不可访问

我想这意味着在像上面这样的联接中,
by
必须采用
.EACHI
,或者从左表中取一个列名(
a
),该列名不是联接变量名(如上面的问题所示,
id
不能正常工作,即使它也在
a
中)。因为使用
a
中的列名似乎可以正常工作:

a[b, .SD, on = .(id)]
# id t  x
# 1:  1 1 11
# 2:  1 2 12
# 3:  2 1 13

回答得好。顺便说一下,另一个例子要考虑<代码> [b,Sy(y),on =(id),by =(t)] /<代码> -UB= Work,但是Y(来自B)没有找到。在DATA表1.114下面给出了预期的输出,因此上面的解释似乎不再有效。你想重新考虑一下你的答案吗a[b,on=(id),sum(x),by=(id)]id V1:1232:213由于我可以在上面的注释中添加换行符,您可能需要想象在*a[b,on=(id),sum(x),by=(id)]*之后和*V1:1233之后换行符*
a[b, sum(x), on = .(id), by = .(t)]
   t V1
1: 1 24
2: 2 12