想象一下,我有data.table
DT
列a, b, c
。我想根据a
过滤行(例如,只选择值为"A"
的行),按b
计算c
的总和。我可以通过
setkey(DT, a)
DT[.("A"), .(sum.B = sum(B)), by = .(C)]
如果我想根据新获得的sum.b
的值过滤行怎么办?如果我想保留sum.b
等于c(3, 4, 5)
之一的行,我可以通过说
DT[.("A"), .(sum.B = sum(B)), by = .(C)][sum.b %in% c(3, 4, 5)]
但后一种操作使用慢速矢量扫描。有没有办法在飞行中设置键""在链接的同时?理想情况下我会
DT[.("A"), .(sum.B = sum(B)), by = .(C)][??set sum.b as key??][.(c(3, 4, 5))]
我不知道中间步骤。
答案 0 :(得分:2)
您在问题中提出的中间步骤如下:
# unnamed args
DT[,.SD,,sum.b]
# named args
DT[j = .SD, keyby = sum.b]
# semi named
DT[, .SD, keyby = sum.b]
然而,您应该对数据进行基准测试,因为可能比矢量扫描慢,因为您需要设置密钥。
看起来eddi已在评论中提供了该解决方案。他提到的FR是{{3}}。