【问题标题】:R won't compute means correctly with aggregate functionR 不会使用聚合函数正确计算均值
【发布时间】:2021-08-16 02:29:52
【问题描述】:

不确定为什么 R 不能正确计算我的数据的平均值。我确实有很多 NA 值,但 R 一直告诉我平均值是 NA。这是一个例子:

data1=read_excel"pepper.xlsx"

data1$cultivar = as.factor(data1$cultivar)

mean = aggregate(data1[,3:4], list(data1$cultivar), mean)
cultivar replication width height
BOF 1 12 14
BOF 2 10 NA
BOF 3 NA 15
BOF 4 NA NA

它不是计算 BOF 的平均宽度为 11 和平均 height 为 14.5,而是计算高度和宽度的平均值为 NA。这是对我的数据的过度简化。我的研究中有几个品种,并使用aggregate 函数计算了每个品种的每个变量的平均值。

【问题讨论】:

  • mean 有一个参数 na.rm 来删除缺失值。添加na.rm = TRUE 作为参数。详情请见?mean
  • 另外,请注意您的措辞 - “R 不会正确计算意味着”听起来好像您认为 R 中存在错误。“我如何忽略 mean 中的缺失值”是更政治化的方式来表达这个问题。
  • aggregate(.~cultivar, data1, mean, na.rm = TRUE)
  • @GregorThomas 谢谢!这解决了我的问题。对措辞感到抱歉,但感谢您的提醒。我以前从未编码过,我希望自学 R 来分析我的研究生课程的数据。希望如果我不小心说错了话或做错了事,我不会受到这个社区的强烈反对。只是来这里学习!

标签: r aggregate mean


【解决方案1】:

更新: 不需要匿名函数(感谢 Gregor Thomas,参见 cmets)。我们可以使用:

summarise(across(where(is.numeric), mean, na.rm = TRUE))

第一个答案: 感谢 Gregor Thomas colMeans不会在这里工作。 我们可以使用dplyrsummariseacross

library(dplyr)

df %>% 
  group_by(cultivar) %>% 
  summarise(across(where(is.numeric),~ mean(., na.rm = TRUE)))

输出:

  cultivar replication width height
  <chr>          <dbl> <dbl>  <dbl>
1 BOF              2.5    11   14.5

【讨论】:

  • 这并没有考虑到 aggregate 所做的分组......这就是我猜测你为什么要投票的原因。
  • @Gregor Thomas。谢谢你的提示。请看我的编辑!
  • 这里不需要匿名函数,可以简化为summarise(across(where(is.numeric), mean, na.rm = TRUE))
  • 感谢格雷戈尔·托马斯。我已经更新了答案!
【解决方案2】:

试试这个:

mean = aggregate(data1[,3:4], list(data1$cultivar), mean, na.rm = TRUE, na.action = na.pass)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多