You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:24:28