如何通过dir.create批量保存文件?解决路径无效报错问题
问题修复:批量创建层级文件夹并保存R数据框报错处理
问题描述
我有两个数据框hp_cons_x和aux,需要按.../rgn11cd/lad21cd/msoa11cd.rdata的层级结构批量保存文件,其中rgn11cd和lad21cd是要创建的嵌套文件夹。编写的代码如下:
aux = hp_cons_x %>% select(rgn11cd, lad21cd, msoa11cd) %>% distinct() %>% drop_na() for(i in 1:nrow(aux)){ dir.create(paste0("01 Raw Data/EPC/processed_buckets/test/", aux[i]$rgn11cd,aux[i]$lad21cd)) save(hp_cons_x, file = paste0("01 Raw Data/EPC/processed_buckets/test/",aux[i]$rgn11cd, aux[i]$lad21cd, aux[i]$msoa11cd, ".rdata")) }
运行后报错:
Error in dir.create(paste0("01 Raw Data/EPC/processed_buckets/test/", : invalid 'path' argument
错误原因与修复方案
报错核心是路径格式错误和无法创建嵌套文件夹,具体修复点如下:
- 路径拼接缺少分隔符:原代码把
rgn11cd和lad21cd直接拼接,生成类似E09E09000001的无效文件夹名,正确层级路径需要用/分隔各层级。 - 无法创建嵌套文件夹:
dir.create默认不支持多层嵌套创建,需添加recursive = TRUE参数。 - 重复创建文件夹:循环会重复创建相同的
rgn11cd/lad21cd文件夹,可先对aux按这两个字段去重,一次性创建所有需要的文件夹。 - 保存文件路径错误:原保存路径未在
lad21cd后加分隔符,导致文件名包含文件夹名称,需修正为正确层级路径。 - 额外优化:原代码保存整个
hp_cons_x,实际应保存当前msoa11cd对应的子集,避免文件冗余。
修正后的代码
基础循环版本
library(dplyr) # 预处理aux,确保无缺失值且去重 aux = hp_cons_x %>% select(rgn11cd, lad21cd, msoa11cd) %>% distinct() %>% drop_na() # 先创建所有需要的嵌套文件夹(按rgn11cd+lad21cd去重,避免重复创建) folder_paths = aux %>% distinct(rgn11cd, lad21cd) %>% mutate(folder = paste0("01 Raw Data/EPC/processed_buckets/test/", rgn11cd, "/", lad21cd)) %>% pull(folder) # 批量创建文件夹,recursive=TRUE允许创建多层嵌套 walk(folder_paths, ~dir.create(.x, recursive = TRUE, showWarnings = FALSE)) # 循环保存每个msoa对应的数据集子集 for(i in 1:nrow(aux)){ # 筛选当前msoa11cd的数据 current_data = hp_cons_x %>% filter(msoa11cd == aux[i]$msoa11cd) # 构建保存路径 save_path = paste0("01 Raw Data/EPC/processed_buckets/test/", aux[i]$rgn11cd, "/", aux[i]$lad21cd, "/", aux[i]$msoa11cd, ".rdata") # 保存数据 save(current_data, file = save_path) }
purrr简洁版本
library(dplyr) library(purrr) library(stringr) aux = hp_cons_x %>% select(rgn11cd, lad21cd, msoa11cd) %>% distinct() %>% drop_na() # 创建所有嵌套文件夹 aux %>% distinct(rgn11cd, lad21cd) %>% mutate(path = str_glue("01 Raw Data/EPC/processed_buckets/test/{rgn11cd}/{lad21cd}")) %>% pull(path) %>% walk(~dir.create(.x, recursive = TRUE, showWarnings = FALSE)) # 批量保存数据 aux %>% pwalk(function(rgn11cd, lad21cd, msoa11cd) { data_subset = hp_cons_x %>% filter(msoa11cd == !!msoa11cd) save_path = str_glue("01 Raw Data/EPC/processed_buckets/test/{rgn11cd}/{lad21cd}/{msoa11cd}.rdata") save(data_subset, file = save_path) })
内容的提问来源于stack exchange,提问作者Fredie Didier
相关产品推荐
相关产品推荐

