在R语言中如何基于地区列表匹配州并汇总死亡数据?
R语言:州匹配地区并汇总死亡数的最优实现方法
现有数据
a) 地区-州代码映射列表
regions <- list( west = c("WA", "OR", "CA", "NV", "AZ", "ID", "MT", "WY", "CO", "NM", "UT"), south = c("TX", "OK", "AR", "LA", "MS", "AL", "TN", "KY", "GA", "FL", "SC", "NC", "VA", "WV"), midwest = c("KS", "NE", "SD", "ND", "MN", "MO", "IA", "IL", "IN", "MI", "WI", "OH"), northeast = c("ME", "NH", "NY", "MA", "RI", "VT", "PA", "NJ", "CT", "DE", "MD", "DC") )
b) 州死亡数数据集(示例)
# A tibble: state Deaths <chr> <int> 1 AL 29549 2 AK 741 3 AR 50127 4 NJ 15142 5 CA 175213 6 IA 1647 ...
最优实现方法
推荐使用tidyverse工具链(dplyr + purrr)完成,步骤清晰且处理效率高:
完整代码
library(tidyverse) # 将regions列表转换为长格式映射表 region_mapping <- imap_dfr(regions, ~ tibble(region = .y, state = .x)) # 假设原死亡数数据集名为death_data,执行匹配与汇总 death_summary <- death_data %>% left_join(region_mapping, by = "state") %>% group_by(region) %>% summarize(total_deaths = sum(Deaths, na.rm = TRUE))
关键步骤说明
imap_dfr():遍历regions列表时同时保留地区名(列表元素名)和对应州代码,直接合并为标准tibble,比基础R的stack()更易控制列名left_join():确保原数据中所有州都被保留,未匹配到地区的州(比如示例中的AK)会标记为NA,可根据需求后续处理sum(..., na.rm = TRUE):避免因存在未匹配的NA值导致汇总结果出错
基础R替代方案
如果不想加载tidyverse包,也可以用基础R实现:
# 转换regions为数据框 region_mapping <- stack(regions) colnames(region_mapping) <- c("state", "region") # 合并数据并按地区汇总 merged_data <- merge(death_data, region_mapping, by = "state", all.x = TRUE) death_summary <- aggregate(Deaths ~ region, data = merged_data, sum, na.rm = TRUE)
内容的提问来源于stack exchange,提问作者Nicolás Sacco
相关产品推荐
相关产品推荐

