【问题标题】:Getting NA when summarizing by columns in data.table按 data.table 中的列汇总时获取 NA
【发布时间】:2014-10-30 20:52:41
【问题描述】:

我正在尝试根据 data.table 中的单个列来总结(取平均值)。

这是我的数据和我使用的代码的玩具示例,显示了我遇到的问题:

library(data.table)
a<- data.table(
  a=c(1213.1,NA,113.41,133.4,121.1,45.34),
  b=c(14.131,NA,1.122,113.11,45.123,344.3),
  c=c(101.2,NA,232.1,194.3,12.12,7645.3),
  d=c(11.32,NA,32.121,94.3213,1223.1,34.1),
  e=c(1311.32,NA,12.781,13.2,2.1,623.2),
  f=c("A", "B", "B", "A", "B", "X"))
a
setkey(a,f) # column "f" is what I want to summarize columns by

a[, lapply(.SD, mean), by=f, .SDcols=c(1:4)] # I just want to summarize first 4 columns

最后一行的输出:

> a[, lapply(.SD, mean), by=f, .SDcols=c(1:4)]
 f a b c d
1: A 673.25 63.6205 147.75 52.82065
2: B NA NA NA NA
3: X 45.34 344.3000 7645.30 34.10000

为什么B条目是NA?在计算平均值时不应该忽略NA 吗?我想我发现了一个类似的问题here,但也许这是不同的和/或我的语法搞砸了。

如果 data.table 无法做到这一点,我愿意接受其他建议。

【问题讨论】:

  • 要忽略NAs,您需要参数na.rm=TRUE。试试a[, lapply(.SD, mean, na.rm=TRUE), by=f, .SDcols=c(1:4)]
  • 啊。很简单。你能写出来吗?我给你积分

标签: r data.table mean na


【解决方案1】:

在 R 中,mean() 函数的默认行为是在缺少值时输出NA。要在均值计算中忽略NAs,您需要设置参数na.rm=TRUElapply 为它传递的函数接受额外的参数,所以对于你的问题,你可以尝试

a[, lapply(.SD, mean, na.rm=TRUE), by=f, .SDcols=c(1:4)]

【讨论】:

  • 抱歉,为什么这不是data.table 问题(我将您的标签编辑回滚到 Q)? :-O
  • 因为在 data.table 中遇到这种行为纯属巧合;即使没有library(data.table),包含NA 的列的平均值仍然是NA
  • @Hugh,它可以帮助(未来)有相同问题的用户使用 data.table 标签快速识别这个答案。问题的标题是“data.table 给出...”。不太了解发生了什么的人很难搜索整个 R 标签。
猜你喜欢
  • 2016-07-31
  • 2015-07-26
  • 2013-05-07
  • 2016-11-15
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多