当前位置:  开发笔记 > 编程语言 > 正文

数据表聚合遇到NA麻烦

如何解决《数据表聚合遇到NA麻烦》经验,为你挑选了1个好方法。

我正在使用该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参数的情况下也是如此?谢谢。



1> Jaap..:

这是将方括号放在正确位置的问题。您应该使用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)]

这使:

   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")在代码中省略了该部分,因为在这种情况下不需要它。包括它会给您相同的结果。

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有