R语言中如何按区域分组统计dataframe的ID总和及伤亡汇总数据
报错原因
- 执行
group_by+summarise操作后,dplyr默认仅保留分组字段和summarise内显式计算生成的字段,你没有在summarise中处理ID字段,执行完summarise后ID就被丢弃了,后续mutate调用自然找不到该对象。 - 你计算事故数的逻辑有误:
sum(ID)是对ID字段的值求和,不是统计事故数量,要统计每个分组的事故行数应该用n(),如果存在单起事故对应多条重复ID的情况,用n_distinct(ID)统计唯一事故数更稳妥。 - 原有代码还存在语法问题:
across(Population)所在行缺少右括号,属于语法错误。
修正后代码
如果你的ID是唯一值,每一行对应一起独立事故,用以下代码即可:
library(dplyr) crashes_stats_TA <- crashes_TA %>% group_by(TA_code, TA_name) %>% summarise( # 所有带count的字段求和 across(contains("count"), ~sum(., na.rm = TRUE)), # 人口和百分比字段求均值,不需要的话可以删除这两行 across(Population, ~mean(., na.rm = TRUE)), across(contains("perc"), ~mean(., na.rm = TRUE), .names = "{.col}_mean"), # 直接统计事故数量 crashes = n() ) %>% # 计算总伤亡人数 mutate(casualties = fatal_count + serious_injury_count + minor_injury_count)
如果ID存在重复,把crashes = n()替换为crashes = n_distinct(ID, na.rm = TRUE)即可。
代码说明
- 所有统计计算都放在
summarise内完成,避免后续mutate找不到字段的问题 - 伤亡人数计算不需要加
round,因为人数本身就是整数,求和结果也为整数 - 如果不需要Population、perc相关的统计字段,直接删除对应的
across行即可,不影响核心字段的计算结果
内容的提问来源于stack exchange,提问作者scumbagsurfer
相关产品推荐
相关产品推荐

