R `通过data.table中的`and`.EACHI`
为什么上面的查询在第二行不返回id=2,V1=13?使用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
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