2017-12-27 10 views
2
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 

なぜ上記のクエリは2番目の行にid = 2、V1 = 13を返さないのですか?私は、私もby=.EACHIを使用して期待するものを得る:data.tableの `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 

答えて

2

我々がから任意の変数を使用して参加するのbyパラメータでby=.EACHIを使用し、そしてべきではありません、右をしているときは、2 data.tables間の結合と思われます右のテーブル(bはここにあります)は、結果として得られる結合テーブルではアクセスできなくなります。最初のクエリでby = .idが機能しないのはなぜですか? [=のbycolsによって、=、Jに、i]はDTに注意ここでhttp://franknarf1.github.io/r-tutorial/_book/tables.html

セクション3.5.3で述べたよう

。ちょうど繰り返す:ちょうどby = .EACHIは で働く。 =値によって、他の入力すると、私の列が 利用できない

このクエリは、私は少し良く上記の文を理解する助けになることが原因となります:idのほか、bから

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

列を、アクセスすることはできませんこの結合のために.SDにあります。

が、私はそれが上記のように参加して意味を推測、byはどちらか.EACHI、またはショー、id doesnの上記の質問のように(参加変数名ではありません、左表の列名(ここではa)を取る必要がありますたとえそれがaにあるとしても、うまく動作しません)。 aの列名を使用すると正しく動作するようです:

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

ニースの答えです。 Btwは、a = bであり、a = bであり、y = bであると考えられる別の例である。 – Frank