时间序列场景下R中按年、城镇分组计算均值时如何仅统计非NA值超2的分组?
实现代码
df %>% group_by(year, town) %>% summarise( # 统计组内非NA值的数量 valid_count = sum(!is.na(value)), # 非NA值超过2个时计算均值,否则返回数值型NA mean_year = if_else(valid_count > 2, mean(value, na.rm = TRUE), NA_real_), .groups = "drop" )
逻辑说明
- 完全匹配需求规则:每个分组先统计剔除NA后的有效样本量,仅当有效数严格大于2(即至少3个非NA值)时,才计算带NA剔除的均值;不满足数量门槛的分组,仍保留在结果中,但均值输出为NA。
- 对应示例的输出效果:
- 2001年ny分组:仅1个非NA值,不满足门槛,输出NA
- 2002年ny分组:共3个非NA值,计算得到均值约0.156,和预期一致
- 2002年ca分组:共3个非NA值,正常计算对应均值
- 注意细节:
- 不要用分组后
filter(valid_count >2)的写法,这种逻辑会把有效数不够的分组从结果中直接删除,不符合“保留分组行、值为NA”的输出要求 - 判断不满足条件返回缺失值时,需使用
NA_real_指定为数值型,避免if_else因返回值类型不匹配报错 - 调整有效数门槛时,直接修改
valid_count > 2里的判断阈值即可
- 不要用分组后
内容的提问来源于stack exchange,提问作者fifigoblin
相关产品推荐
相关产品推荐

