我正在使用该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
添加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
而a,1的x1值应该是10。知道哪一个原因即使在使用na.rm参数的情况下也是如此?谢谢。
这是将方括号放在正确位置的问题。您应该使用lapply(.SD, sum, na.rm = TRUE)
而不是lapply(.SD, sum(x, na.rm = TRUE))
。使用时lapply
,您必须在sum
-的调用之后sum
而不是在for的内部添加-function 的额外参数sum
。此外,您在中不需要(x)
-part sum(x)
。因为lapply
is 的结构,lapply(X, FUN, ...)
所以FUN
-part中指定的函数会自动应用于-part中的变量X
。
因此,您的代码应为:
setDT(f1)[, lapply(.SD, sum, na.rm = TRUE), by = .(name,t)]
这使:
name t x1 x2 1: a 1 0 11 2: a 2 5 9 3: b 2 18 12 4: b 1 1 4
注意:我.SDcols = c("x1", "x2")
在代码中省略了该部分,因为在这种情况下不需要它。包括它会给您相同的结果。