数据表聚合遇到NA麻烦

cod*_*art 2 r na data.table

我正在使用该data.table程序包将给定位置的每个时间段内具有多个观察值的面板聚合到一个面板中,该面板中的时间段位置具有唯一观察值。但是,在使用NA进行观测汇总时遇到了麻烦。虽然这很好用:

set.seed(123)
data.frame(name = c("a", "a", "a", "b", "b", "b"), t = rep(c(1,2),3), x1 = sample(0:10,6), x2 =  sample(0:10,6))
f1

  name t x1 x2
    a 1  3  5
    a 2  7  8
    a 1 10  4
    b 2  9  3
    b 1  6  6
    b 2  0  2

f2 <- setDT(f1)[, lapply(.SD, sum(x, na.rm = TRUE)), by = .(name,t), .SDcols = c("x1", "x2")]
f2

   name t x1 x2
    a 1 13  9
    a 2  7  8
    b 2  9  5
    b 1  6  6
Run Code Online (Sandbox Code Playgroud)

添加NA sum()不能正常工作:

f1[1,3] <- NA
f1
   name t x1 x2
    a 1 NA  5
    a 2  7  8
    a 1 10  4
    b 2  9  3
    b 1  6  6
    b 2  0  2

f2 <- setDT(f1)[, lapply(.SD, sum(x, na.rm = TRUE)), by = .(name,t), .SDcols = c("x1", "x2")]
f2
name t x1 x2
    a 1 NA  9
    a 2  7  8
    b 2  9  5
    b 1  6  6
Run Code Online (Sandbox Code Playgroud)

而a,1的x1值应该是10。知道哪一个原因即使在使用na.rm参数的情况下也是如此?谢谢。

Jaa*_*aap 5

这是将方括号放在正确位置的问题。您应该使用lapply(.SD, sum, na.rm = TRUE)而不是lapply(.SD, sum(x, na.rm = TRUE))。使用时lapply,您必须在sum-的调用之后sum而不是在for的内部添加-function 的额外参数sum。此外,您在中不需要(x)-part sum(x)。因为lapplyis 的结构,lapply(X, FUN, ...)所以FUN-part中指定的函数会自动应用于-part中的变量X

因此,您的代码应为:

setDT(f1)[, lapply(.SD, sum, na.rm = TRUE), by = .(name,t)]
Run Code Online (Sandbox Code Playgroud)

这使:

   name t x1 x2
1:    a 1  0 11
2:    a 2  5  9
3:    b 2 18 12
4:    b 1  1  4
Run Code Online (Sandbox Code Playgroud)

注意:我.SDcols = c("x1", "x2")在代码中省略了该部分,因为在这种情况下不需要它。包括它会给您相同的结果。