未经测试的快速答案:似乎您正在寻找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 就像子集一样运行;即,j
仅在i
缺少 by 时为每一行运行(因此名称为by-without-by)。因此,您需要variable
再次包含 ,by
如上所示。
或者,以下内容应通过id
“x”和“y”的并集进行分组(但以上是您在问题中所要求的,iiuc):
input[c("x","y"),sum(value),by=id]