【问题标题】:dplyr Summarise improperly excluding NAdplyr 不正确地总结不包括 NA
【发布时间】:2018-06-08 11:38:56
【问题描述】:

我们可以按气缸对 mtcar 进行分组,并使用一些简单的代码汇总每加仑英里数。

library(dplyr)
mtcars %>% 
  group_by(cyl) %>% 
  summarise(avg = mean(mpg))

这提供了如下所示的正确输出。

    cyl      avg
1     4 26.66364
2     6 19.74286
3     8 15.10000

如果我请 dplyr 排除 NA,我会得到一些奇怪的结果。

mtcars %>% 
  group_by(cyl) %>% 
  summarise(avg = mean(!is.na(mpg)))

由于此数据集中没有 NA,因此结果应与上述相同。但它将所有 mpg 平均为“1”。 我的代码有问题还是 dplyr 中的错误?

    cyl   avg
1     4     1
2     6     1
3     8     1

我的实际数据集确实有一些我需要排除的 NA 仅用于此摘要,但表现出相同的行为。

【问题讨论】:

  • 你取的是 logical 值的平均值,而不是 mean(!is.na(mpg)) 时的数字值

标签: r dplyr


【解决方案1】:

你想要这个:

mtcars %>% 
group_by(cyl) %>% 
summarise(avg = mean(mpg, na.rm = T))

# A tibble: 3 x 2
    cyl      avg
  <dbl>    <dbl>
1     4 26.66364
2     6 19.74286
3     8 15.10000

现在,您正在返回一个带有!is.na(mpg)logical 向量。当您采用 logical 向量的 mean() 时,它将被强制为 1,而不是您想要的 numeric 值。

【讨论】:

    【解决方案2】:

    按照您的编码方式,mean() 函数的输入是 TRUE 和 FALSE 值的向量。请改用mean(mpg[!is.na(mpg)])

    考虑使用我用于说明目的的data.table。以下都产生相同的结果。

    library(data.table)
    MT[, mean(mpg), by = cyl]
       cyl       V1
    1:   6 19.74286
    2:   4 26.66364
    3:   8 15.10000
    
    MT[, mean(mpg, na.rm=TRUE), by = cyl]
       cyl       V1
    1:   6 19.74286
    2:   4 26.66364
    3:   8 15.10000
    
    MT[, mean(mpg[!is.na(mpg)]), by = cyl]
       cyl       V1
    1:   6 19.74286
    2:   4 26.66364
    3:   8 15.10000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 2021-02-19
      • 2021-09-14
      相关资源
      最近更新 更多