data.table不计算by中的NA组

JRR*_*JRR 7 grouping group-by r na data.table

这个问题在这里有部分答案,但问题太具体了,我无法将其应用于我自己的问题.

我想在使用时跳过NA组的潜在重量计算by.

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)]
Run Code Online (Sandbox Code Playgroud)

在这里,我们可以看到最多有5个组,包括该(NA, NA)组.考虑到(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)]
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 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
Run Code Online (Sandbox Code Playgroud)

?.BY帮助:

.BY是一个list包含每个项目的长度为1的向量by.if()根据组变量的值,这可以用于分支.

  • @Manish你可以尝试`DT [,{print(.BY); cat("next group ... \n")},by =.(g1,g2)]`以获得它的直觉.如果不能清除它,我邀请你到聊天室跟进 (2认同)
  • @smci 谢谢:) Fwiw,这是我的备忘单,包括 `.BY` http://franknarf1.github.io/r-tutorial/_book/tables.html#notation-cheat-sheet,尽管不是 `j = if (. ..) ...` (2认同)