R语言工作目录指定类型文件批量导入导出方法咨询
R语言文件批量导入与导出实现方法
两类核心操作的实现方式如下,优先推荐用列表统一管理读写对象,避免全局环境污染,后续批量处理效率更高:
- 工作目录指定类型文件批量导入、按规则命名
- R环境内对象批量导出到工作目录、按规则命名
1. 批量导入指定格式文件
首先修正你原有代码的两个问题:
list.files()的匹配规则建议用正则锁定后缀,避免误命中名称中带对应字符串的非目标文件,比如pattern = "\\.csv$"代表只匹配以.csv结尾的文件- RDS格式文件需要用
readRDS()读取,不能用read.csv()
1.1 推荐方式:导入后存入统一列表
这种方式不会在全局环境生成大量零散变量,后续批量处理、导出时直接遍历列表即可,不需要单独检索变量名:
# 批量导入CSV文件 temp_csv <- list.files(pattern = "\\.csv$") csv_import <- lapply(temp_csv, function(path) read.csv(path, stringsAsFactors = FALSE)) # 列表元素名默认用去掉后缀的原文件名,方便识别 names(csv_import) <- gsub("\\.csv$", "", temp_csv) # 批量导入RDS文件 temp_rds <- list.files(pattern = "\\.RDS$") rds_import <- lapply(temp_rds, readRDS) names(rds_import) <- gsub("\\.RDS$", "", temp_rds)
如果需要调用其中某个文件,直接用列表名$元素名即可,比如csv_import$my_file就对应导入的my_file.csv。
1.2 按索引命名为全局变量
如果确实需要生成file_1、file_2这类独立全局变量,用assign()函数在循环中赋值即可:
# 批量导入CSV并按索引命名 for (i in seq_along(temp_csv)) { assign(paste0("file_", i), read.csv(temp_csv[i], stringsAsFactors = FALSE)) } # 批量导入RDS并按索引命名 for (i in seq_along(temp_rds)) { assign(paste0("file_", i), readRDS(temp_rds[i])) }
2. 批量导出环境内对象
你之前参考的代码需要先把所有对象合并成一个数据框,局限性很强,遇到不同结构的对象会直接报错,更通用的实现方式是先筛选出需要导出的对象名,再循环导出:
2.1 筛选待导出对象
如果需要导出全局环境中所有数据框对象(不受命名规则限制),用以下代码自动提取对象名:
# 提取全局环境中所有数据框类型的对象名称 export_obj <- ls()[sapply(ls(), function(x) is.data.frame(get(x)))]
如果只需要导出指定对象,直接给export_obj赋值为对象名组成的字符向量即可,比如export_obj <- c("monday", "october")。
2.2 批量导出
支持按原对象名命名,也支持按索引规则命名:
# 按原对象名批量导出为CSV for (obj in export_obj) { write.csv(get(obj), paste0(obj, ".csv"), row.names = FALSE) } # 按file_1、file_2规则批量导出为RDS for (i in seq_along(export_obj)) { saveRDS(get(export_obj[i]), paste0("file_", i, ".RDS")) }
说明:RDS格式支持所有R对象类型(向量、列表、模型结果等),如果要导出非数据框类的对象到RDS,只需要把筛选对象时的
is.data.frame替换成对应类型判断函数即可;CSV格式仅支持二维表结构的数据导出。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

