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
相关产品推荐
相关产品推荐

