我们可以通过气缸对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,我只需要为此摘要排除,但表现出相同的行为。
答案 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