这个问题有部分答案here,但问题太具体了,我无法将其应用于我自己的问题。
在使用by
时,我想跳过NA组的潜在重量计算。
library(data.table)
DT = data.table(X = sample(10),
Y = sample(10),
g1 = sample(letters[1:2], 10, TRUE),
g2 = sample(letters[1:2], 10, TRUE))
set(DT, 1L, 3L, NA)
set(DT, 1L, 4L, NA)
set(DT, 6L, 3L, NA)
set(DT, 6L, 4L, NA)
DT[, mean(X*Y), by = .(g1,g2)]
在这里,我们可以看到最多包含(NA, NA)
组的5个组。考虑到(i)该组是无用的(ii)这些组可能非常大并且(iii)实际计算比mean(X*Y)
更复杂,我能否以有效的方式跳过该组?我的意思是,没有创建剩余表的副本。确实以下是有效的。
DT2 = data.table:::na.omit.data.table(DT, cols = c("g1", "g2"))
DT2[, mean(X*Y), by = .(g1,g2)]
答案 0 :(得分:8)
您可以使用if
子句:
DT[, if (!anyNA(.BY)) mean(X*Y), by = .(g1,g2)]
g1 g2 V1
1: b a 25.75000
2: a b 24.00000
3: b b 35.33333
来自?.BY
帮助:
.BY
是一个list
,其中包含by
中每个项目的长度为1的向量。根据组变量的值,这可以用if()
进行分支。