You need to enable JavaScript to run this app. R语言如何通过for循环对db03到db17数据集批量执行相同清洗代码
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何通过for循环对db03到db17数据集批量执行相同清洗代码

完全可以通过for循环实现,核心是用get()函数从全局环境读取对应名称的数据集,用assign()函数将处理后的结果写回全局环境即可,你可以参考以下实现方案:

第一步:封装清洗逻辑为自定义函数

将你写好的固定清洗逻辑封装成函数,避免循环内重复写代码,也方便后续调整逻辑:

# 加载依赖包(提前运行一次即可)
library(dplyr)
library(janitor)

clean_db <- function(raw_db) {
  # 转置矩阵
  db_t <- t(raw_db)
  # 转为data.frame格式
  db_t <- as.data.frame(db_t)
  # 第一行设为列名
  db_t <- row_to_names(db_t, 1, remove_row = TRUE)
  # 重命名前四列
  colnames(db_t)[1:4] <- c("name","code","cluster","sector")
  # 剔除Commodities行业
  db_t_nocomm <- db_t[!(db_t$cluster=="Commodities"),]
  rm(db_t)
  # 仅保留EORA26行业分类
  eora26_pattern <- "Agriculture|Fishing|Mining and Quarrying|Food and Beverages|Textiles and Wearing Apparel|Wood and Paper|Petroleum, Chemical and Non-Metallic Mineral Products|Metal Products|Electrinal and Machinery|Transport Equipment|Other Manufacturing|Recylcing|Electricity, Gas and Water|Construction|Maintenance and Repair|Wholesale Trade|Retail Trade|Hotels and Restaurants|Transport|Post and Telecommunications|Financial Intermediation and Business Activities|Public Administration|Education, Health and Other Services|Private Households|Others|Re-export & Re-import"
  db_t_nocomm_f <- filter(db_t_nocomm, grepl(eora26_pattern, sector))
  rm(db_t_nocomm)
  # 将VA值转为数值型
  db_t_nocomm_f[, 5:194] <- sapply(db_t_nocomm_f[, 5:194], as.numeric)
  # 计算总VA
  db_t_nocomm_f$Total <- rowSums(db_t_nocomm_f[,5:194], na.rm = TRUE)
  db_t_nocomm_f <- db_t_nocomm_f %>% relocate(Total, .before = Afghanistan)
  # 计算内部VA
  db_t_nocomm_f$Internal_VA <- as.numeric(db_t_nocomm_f[cbind(1:nrow(db_t_nocomm_f), match(db_t_nocomm_f$name, names(db_t_nocomm_f)))])
  # 计算净出口VA
  db_t_nocomm_f$Net_TotalExp <- db_t_nocomm_f$Total - db_t_nocomm_f$Internal_VA
  db_t_nocomm_f <- db_t_nocomm_f %>% relocate(c(Internal_VA,Net_TotalExp), .before = Afghanistan)
  # 输出最终结果
  db_final <- db_t_nocomm_f[,c(1,2,3,4,7)]
  rm(db_t_nocomm_f)
  return(db_final)
}

第二步:编写for循环批量处理

# 构造所有待处理的数据集名称:db03到db17
db_names <- paste0("db", sprintf("%02d", 3:17))

# 遍历执行清洗
for (db_name in db_names) {
  # 读取当前原始数据集
  raw_data <- get(db_name)
  # 调用清洗函数处理
  cleaned_data <- clean_db(raw_data)
  # 将处理后的结果写入全局环境,命名规则为 原名称_final
  assign(paste0(db_name, "_final"), cleaned_data)
  # 清理临时变量释放内存(可选)
  rm(raw_data, cleaned_data)
}

注意事项

  • 如果不同年份的数据集列数存在差异,可以将代码中的5:194修改为5:ncol(db_t_nocomm_f),兼容不同列数的情况
  • 执行完成后,你环境中会生成db03_final到db17_final共15个处理完成的数据集

内容的提问来源于stack exchange,提问作者nflore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 22:39:02