R语言批量循环处理多年度mort系列数据集的实现方法
批量处理多年份死亡率数据实现方案
核心逻辑是把单年份处理流程封装为接收年份参数的自定义函数,遍历所有目标年份自动执行,全程不需要手动替换年份值。
前期准备
- 把跨年份通用的文件(crosswalk、全量人口表)放在循环外只读一次,减少重复IO提升运行效率
- 所有硬编码的年份值全部替换为函数参数,自动适配不同年份的读取、筛选、输出逻辑
library(tidyverse) # 读取跨年份通用文件 crosswalk <- read_csv("crosswalk.csv") %>% select(-X1) pop_full <- read_csv("population_file.csv") %>% select(-X1)
定义单年份处理函数
process_single_year <- function(year_val) { # 读取对应年份原始死亡数据 mrt <- read_csv(paste0("mort", year_val, ".csv")) %>% rename(nchs_code = countyrs) # 匹配编码表做数据清洗 mrt_cw <- left_join(mrt, crosswalk, by = "nchs_code") mrt_cw1 <- mrt_cw %>% filter(cityrs == 999) %>% select(fips, racer3) %>% mutate(count = 1) %>% group_by(fips, racer3) %>% summarise(mrt_c = sum(count), .groups = "drop") %>% mutate( racer3 = case_when( racer3 == 1 ~ "white_pop", racer3 == 2 ~ "black_pop", racer3 == 3 ~ "other_race_pop" ) ) mrt_cw2 <- pivot_wider( data = mrt_cw1, names_from = racer3, values_from = mrt_c ) # 缺失值转0,计算分种族总死亡数 mrt_cw3 <- mrt_cw2 %>% mutate( white_m = ifelse(is.na(white_pop), 0, white_pop), black_m = ifelse(is.na(black_pop), 0, black_pop), other_race_m = ifelse(is.na(other_race_pop), 0, other_race_pop) ) %>% select(-white_pop, -black_pop, -other_race_pop) %>% mutate(total_m = white_m + black_m + other_race_m) # 匹配对应年份人口数据 pop_year <- pop_full %>% filter(year == year_val) %>% select(-year) mrt_cw4 <- left_join(mrt_cw3, pop_year, by = "fips") # 计算死亡率和异常值标记 mrt_cw5 <- mrt_cw4 %>% mutate( ttl_rate = (total_m/total_pop)*100, blk_rate = (black_m/black_pop)*100, wht_rate = (white_m/white_pop)*100, otr_rate = (other_race_m/other_races_pop)*100 ) mrt_cw6 <- mrt_cw5 %>% mutate(high_flag = ifelse(ttl_rate >= 100 | blk_rate >= 100 | wht_rate >= 100 | otr_rate >= 100, 1, 0)) # 按原有规则输出单年结果文件(1985年对应输出mort_85.csv) write.csv(mrt_cw6, paste0("mort_", str_sub(year_val, 3, 4), ".csv"), row.names = FALSE) # 返回带年份标记的处理结果,方便后续合并全量表 return(mrt_cw6 %>% mutate(year = year_val)) }
批量执行全量年份处理
按需修改年份范围即可一键跑完所有数据:
# 定义需要处理的年份范围,比如这里处理1969到2020年 year_list <- 1969:2020 # 批量执行,自动合并所有年份结果为一张全量表 all_mort_result <- map_dfr(year_list, process_single_year) # 可选:存储全量合并结果 write.csv(all_mort_result, "mort_all_years.csv", row.names = FALSE)
注意事项
- 如果你的原始死亡数据文件名格式是
mort_1969.csv而非mort1969.csv,把读取文件行的paste0("mort", year_val, ".csv")改成paste0("mort_", year_val, ".csv")即可 - 函数里加了
.groups = "drop"参数,会自动清除summarise后的分组标记,避免出现冗余警告 - 如果存在部分年份文件缺失的情况,可以在读取文件前加
if(!file.exists(paste0("mort", year_val, ".csv"))) return(tibble())跳过缺失年份,避免代码中断 - 如果需要调整输出文件命名规则,直接修改
write.csv里的文件名拼接逻辑即可
内容的提问来源于stack exchange,提问作者coinbase_wells
相关产品推荐
相关产品推荐

