使用R 3.5/RStudio 1.1.419时Group/Mutate仅返回NA而非平均值求助
解决聚合城市级指标时返回NA的问题
看起来你在尝试按城市聚合finmei14和finmei15这两个指标时,遇到了结果全为NA的问题——这大概率是因为你没有处理数据中的NA值,以及分组操作的细节没注意到。我来一步步帮你解决:
问题根源
你的数据里,很多城市的finmei14和finmei15字段全是NA,而R的mean()函数默认不会忽略NA值。如果分组内只要有一个NA(或者全是NA),mean()就会直接返回NA,这就是你看到的结果。
另外,R 3.5对应的dplyr版本(当时的版本大概是0.7.x左右)在分组后可能需要手动取消分组,避免后续操作残留分组状态导致的异常。
解决方案
我们用dplyr包来实现正确的聚合,分两种场景处理:
1. 生成每个城市的汇总平均值表
如果你只需要每个城市的指标平均值,用summarise()生成汇总表:
library(dplyr) # 按州、城市、州代码分组,计算平均值并忽略NA city_summary <- your_data_frame %>% group_by(state, city, statefips) %>% summarise( avg_finmei14 = mean(finmei14, na.rm = TRUE), avg_finmei15 = mean(finmei15, na.rm = TRUE), .groups = "drop" # 显式取消分组,适配R 3.5的dplyr版本 ) # 把全NA组的NaN转换为NA(可选,让结果更整洁) city_summary <- city_summary %>% mutate( avg_finmei14 = ifelse(is.nan(avg_finmei14), NA, avg_finmei14), avg_finmei15 = ifelse(is.nan(avg_finmei15), NA, avg_finmei15) ) print(city_summary)
运行后,Amherst的avg_finmei14会是69,avg_finmei15会是64;其他全NA的城市,平均值会显示为NA而不是NaN。
2. 把平均值添加到原数据的每一行
如果你需要在原数据的每一行都带上对应城市的平均值,用mutate():
library(dplyr) df_with_avg <- your_data_frame %>% group_by(state, city, statefips) %>% mutate( # 先判断组内是否全为NA,是的话返回NA,否则计算非NA值的平均值 avg_finmei14 = if(all(is.na(finmei14))) NA else mean(finmei14, na.rm = TRUE), avg_finmei15 = if(all(is.na(finmei15))) NA else mean(finmei15, na.rm = TRUE) ) %>% ungroup() # 取消分组,避免后续操作受分组影响 print(df_with_avg)
这样Amherst的每一行都会显示对应的平均值,其他城市的平均值字段则为NA,符合你的预期。
验证结果
用你的测试数据运行上面的代码,Amherst组的结果会是:
| zip | state | city | statefips | finmei14 | finmei15 | avg_finmei14 | avg_finmei15 |
|---|---|---|---|---|---|---|---|
| 1002 | MA | Amherst | 25 | 69 | 64 | 69 | 64 |
| 1003 | MA | Amherst | 25 | 69 | 64 | 69 | 64 |
| 1004 | MA | Amherst | 25 | 69 | 64 | 69 | 64 |
其他城市的avg_finmei14和avg_finmei15则为NA,这是因为这些城市的指标字段全是NA,没有可用数据计算平均值。
内容的提问来源于stack exchange,提问作者Elombardi
相关产品推荐
相关产品推荐

