使用R的dplyr计算组均值的均值时出现NA错误的解决咨询
使用R的dplyr计算组均值的均值时出现NA错误的解决咨询
你遇到的问题其实是因为mean()函数没办法直接处理dplyr返回的tibble(数据框)对象,咱们一步步来理清楚:
首先先复现你的场景,这部分代码是没问题的:
library(dplyr) df <- data.frame(id = c(1,1,1,2,2), x = 1:5) # 第一步分组求均值是正确的 grouped_means <- df %>% group_by(id) %>% dplyr::summarise(group_mean = mean(x)) grouped_means
输出结果:
# A tibble: 2 × 2 id group_mean <dbl> <dbl> 1 1 2 2 2 4.5
错误原因解析
你之前的代码df %>% group_by(id) %>% dplyr::summarise(group_mean = mean(x)) %>% mean(group_mean)之所以返回NA,是因为管道最后传给mean()的是整个tibble数据框,而mean()默认只接受数值/逻辑向量,面对数据框类型的参数就会报错返回NA。
几种可行的解决方法
方法1:继续用dplyr管道链完成计算
直接在管道末尾再加一层summarise,全程保持dplyr的风格,结果也是结构化的:
df %>% group_by(id) %>% summarise(group_mean = mean(x)) %>% summarise(overall_mean = mean(group_mean))
输出结果:
# A tibble: 1 × 1 overall_mean <dbl> 1 3.25
方法2:提取数值向量后计算均值
用pull()函数把group_mean列提取成纯数值向量,再传给mean():
df %>% group_by(id) %>% summarise(group_mean = mean(x)) %>% pull(group_mean) %>% mean()
直接返回结果:[1] 3.25
方法3:分步存储结果后用base R计算
如果习惯分步处理,可以先把分组后的结果存成对象,再用$提取列计算:
grouped_means <- df %>% group_by(id) %>% summarise(group_mean = mean(x)) mean(grouped_means$group_mean)
同样得到结果:[1] 3.25
额外说明
这里要注意,你要的是组均值的平均(先每个组求平均,再对这些平均求平均),和直接对整个x列求平均逻辑完全不同:直接求整体平均是mean(df$x) = 3,而你需要的是(2 + 4.5)/2 = 3.25,这两种计算的区别要分清楚哦。
备注:内容来源于stack exchange,提问作者skoestlmeier
相关产品推荐
相关产品推荐

