我正在尝试使用一些限制来计算数据帧的一列的平均值,所以首先我做了:
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
的条目,对吗?
答案 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)