data.table 不计算 NA 组
data.table do not compute NA groups in by
这个问题有部分答案但是这个问题太具体了,我无法将它应用到我自己的问题中。
我想在使用 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)
更复杂,我可以以有效的方式跳过组吗?我的意思是,没有创建剩余 table 的副本。确实有以下作品。
DT2 = data.table:::na.omit.data.table(DT, cols = c("g1", "g2"))
DT2[, mean(X*Y), by = .(g1,g2)]
您可以使用 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
is a list
containing a length 1 vector for each item in by
. This can be useful [...] to branch with if()
depending on the value of a group variable.
这个问题有部分答案
我想在使用 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)
更复杂,我可以以有效的方式跳过组吗?我的意思是,没有创建剩余 table 的副本。确实有以下作品。
DT2 = data.table:::na.omit.data.table(DT, cols = c("g1", "g2"))
DT2[, mean(X*Y), by = .(g1,g2)]
您可以使用 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
is alist
containing a length 1 vector for each item inby
. This can be useful [...] to branch withif()
depending on the value of a group variable.