dplyr总结不正确地排除NA

时间:2017-12-27 21:16:51

标签: r dplyr

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

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,我只需要为此摘要排除,但表现出相同的行为。

2 个答案:

答案 0 :(得分:5)

你想要这个:

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

目前,您正在使用logical返回!is.na(mpg)向量。当您使用逻辑向量的mean()时,它将被强制为1,而不是您想要的numeric值。

答案 1 :(得分:0)

您编码它的方式,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