R中计算均值的不同方法

时间:2018-08-25 09:39:58

标签: r

我正在尝试使用一些限制来计算数据帧的一列的平均值,所以首先我做了:

mean(Ykkonen$deltaA[Ykkonen$PH<=2.5], na.rm = TRUE)

但是我当我尝试

Ykkonen %>% filter(PH<=2.5) %>% mean(deltaA, na.rm = TRUE)

我遇到错误

[1] NA
Warning message:
In mean.default(., deltaA) :
argument is not numeric or logical: returning NA

然而deltaA是数字。因此,我试图理解为什么使用%>%管会有所不同吗?

我的意思是,如果我通过输入dataframe %>% filter(a=='s')正确理解了它,那么它应该只返回变量s带有a的条目,对吗?

2 个答案:

答案 0 :(得分:1)

您需要使用摘要功能来获得所需的结果。

Ykkonen %>% filter(PH<=2.5) %>% summarise(mean = mean(deltaA, na.rm = TRUE)

使用Ykkonen %>% filter(PH<=2.5)时,应检查返回的内容。这将是一个data.frame(小标题),而不是一个向量。因此,当您在过滤器之后使用均值时,您将给均值一个data.frame,这将导致此错误。均值执行的检查之一是:

if (!is.numeric(x) && !is.complex(x) && !is.logical(x)) {
warning("argument is not numeric or logical: returning NA") 

并且data.frame不会通过此测试。

答案 1 :(得分:1)

如果要返回一个值作为数字矢量(长度为1),则可以使用pull

Ykkonen %>% filter(PH<=2.5) %>% pull(deltaA) %>% mean(na.rm = TRUE)

以下是可重现的示例:

library(dplyr)

mtcars %>% filter(qsec >= 17) %>% pull(drat) %>% mean(na.rm = TRUE)
# [1] 3.561304

为了确保目标是数字,您还可以像这样使用summarize_if

mtcars %>% filter(qsec >= 17) %>% summarize_if(is.numeric, mean) %>% pull(drat)