You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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组的结果会是:

zipstatecitystatefipsfinmei14finmei15avg_finmei14avg_finmei15
1002MAAmherst2569646964
1003MAAmherst2569646964
1004MAAmherst2569646964

其他城市的avg_finmei14和avg_finmei15则为NA,这是因为这些城市的指标字段全是NA,没有可用数据计算平均值。

内容的提问来源于stack exchange,提问作者Elombardi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:49:32