テストされていない簡単な答え: by-without-by、別名grouping-by-iを探しているようです :
setkey(input,variable)
input[c("x","y"),sum(value)]
これは、SQLの高速HAVINGのようなものです。j
の各行に対して評価されますi
。言い換えれば、上記は同じ結果ですが、よりもはるかに高速です:
input[,sum(value),keyby=variable][c("x","y")]
関心のあるグループのみを選択する前に、すべてのグループの後者のサブセットと評価(無駄に)。前者(by-without-by)は、グループのサブセットにのみ直接適用されます。
グループの結果は、いつものように長い形式で返されます。ただし、後で(比較的小さい)集約データをワイドに再形成するのは比較的瞬時に行う必要があります。それはとにかく考えです。
関心のない列がたくさんある場合、最初のものsetkey(input,variable)
は噛む可能性があります。input
もしそうなら、必要な列をサブセット化する価値があるかもしれません:
DT = setkey(input[ , c("variable","value")], variable)
DT[c("x","y"),sum(value)]
将来、セカンダリキーが実装されると、より簡単になります。
set2key(input,variable) # add a secondary key
input[c("x","y"),sum(value),key=2] # syntax speculative
id
同様にグループ化するには:
setkey(input,variable)
input[c("x","y"),sum(value),by='variable,id']
データに応じてid
、キーに含めることはコストに見合う価値があるかもしれません。setkey
setkey(input,variable,id)
input[c("x","y"),sum(value),by='variable,id']
上記のように、by-without-byとbyを組み合わせると、by-without-byはサブセットのように動作します。つまり、byが欠落している場合j
の各行に対してのみ実行されます(したがって、 by-without-byという名前)。したがって、上記のように、を含める必要があります。i
variable
by
または、代わりに「x」と「y」の和集合を超えてグループ化する必要id
があります(ただし、上記は質問iiucで求めたものです)。
input[c("x","y"),sum(value),by=id]