R语言按年分组统计1-9月WB系列列求和的正确实现
问题原因与解决方法
错误原因
你之前的代码把原始数据框df.100覆盖成了分组求和后的汇总表,这个汇总表已经丢失了Msc(月份)列。所以第二个across里的.[Msc <=9]根本无法筛选月份,实际还是对整列求和,导致结果和全月统计完全一致。
正确解决方法
方法1:拆分筛选与求和,合并结果
先保留原始数据,分别计算全月和1-9月的求和,再合并结果:
# 计算全月求和(不要覆盖原始数据) df_full <- df.100 %>% group_by(Rok) %>% summarise(across(starts_with('WB'), ~sum(.x, na.rm = T))) # 筛选1-9月后计算求和 df_9months <- df.100 %>% filter(Msc <= 9) %>% group_by(Rok) %>% summarise(across(starts_with('WB'), ~sum(.x, na.rm = T), .names = "9_{col}")) # 合并两个结果,同时展示全月与9月数据 df_combined <- left_join(df_full, df_9months, by = "Rok")
方法2:在同一分组内完成条件求和
直接在group_by后的summarise里,对每个分组内的行按月份筛选后求和(前提是原始数据未被覆盖):
df.100.9 <- df.100 %>% group_by(Rok) %>% summarise( # 全月求和 across(starts_with('WB'), ~sum(.x, na.rm = T)), # 1-9月求和:针对分组内的行,筛选Msc<=9的数值再求和 across(starts_with('WB'), ~sum(.x[Msc <= 9], na.rm = T), .names = "9_{col}") )
验证结果
运行上述代码后,9_WB_*列的数值会与全月求和的WB_*列产生明显差异,符合1-9月的统计逻辑。
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

