如何批量导入多个TXT文件到R并简化重复代码?解决导入报错
批量导入相似命名的TXT文件到R环境并解决导入报错
问题背景
需要批量导入8个命名相似的TXT文件,避免重复调用read.delim的冗余代码。原手动导入代码如下:
pbp_2020_total <- read.delim("2020_pbp_b10_amb_trans.txt") pbp_2020_vbid <- read.delim("2020_pbp_b10_b19b_amb_trans_vbid_uf.txt") pbp_2021_total <- read.delim("2021_pbp_b10_amb_trans.txt") pbp_2021_vbid <- read.delim("2021_pbp_b10_b19b_amb_trans_vbid_uf.txt") pbp_2022_total <- read.delim("2022_pbp_b10_amb_trans.txt") pbp_2022_vbid <- read.delim("2022_pbp_b10_b19b_amb_trans_vbid_uf.txt") pbp_2023_total <- read.delim("2023_pbp_b10_amb_trans.txt") pbp_2023_vbid <- read.delim("2023_pbp_b10_b19b_amb_trans_vbid_uf.txt")
尝试以下批量代码后报错,文件存储路径为"/Users/yun/Documents/U/Spring 2024/":
folder <- "/Users/yun/Documents/U/Spring 2024/" txt_files <- list.files(path=folder, pattern=".txt") df= c(rep(data.frame(), length(txt_files))) for(i in 1:length(txt_files)) {df[[i]]<- as.list(read.table(file.path(folder, txt_files[i])))}
报错信息:
Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, : line 2 did not have 65 elements
报错原因
- 替换了原代码的
read.delim为read.table,两者默认参数差异导致读取失败:read.delim默认sep="\t"(制表符分隔)、header=TRUE(第一行是列名)read.table默认sep=""(任意空白分隔)、header=FALSE,无法正确识别制表符分隔的文件列数,触发报错。
- 错误地将读取结果转成
as.list,并存储在data.frame类型的列表中,不符合原需求(原代码是将每个文件存为独立的data.frame)。
可行的批量导入方法
方法1:基础循环(匹配原代码变量命名逻辑)
folder <- "/Users/yun/Documents/U/Spring 2024/" # 精准匹配后缀为.txt的文件,同时返回完整路径 txt_files <- list.files(path = folder, pattern = "\\.txt$", full.names = TRUE) # 生成和原代码一致的变量名 var_names <- sapply(basename(txt_files), function(x) { x_no_ext <- gsub("\\.txt$", "", x) year <- substr(x_no_ext, 1, 4) if (grepl("vbid", x_no_ext)) { paste0("pbp_", year, "_vbid") } else { paste0("pbp_", year, "_total") } }) # 循环读取文件并赋值到全局环境 for (i in seq_along(txt_files)) { assign(var_names[i], read.delim(txt_files[i])) }
方法2:purrr包简洁批量处理(推荐)
如果习惯tidyverse风格,可使用purrr包实现更简洁的批量读取:
library(purrr) folder <- "/Users/yun/Documents/U/Spring 2024/" txt_files <- list.files(path = folder, pattern = "\\.txt$", full.names = TRUE) # 生成目标变量名 var_names <- sapply(basename(txt_files), function(x) { x_no_ext <- gsub("\\.txt$", "", x) year <- substr(x_no_ext, 1, 4) grepl("vbid", x_no_ext) |> ifelse(paste0("pbp_", year, "_vbid"), paste0("pbp_", year, "_total")) }) # 批量读取并命名数据框列表 df_list <- set_names(map(txt_files, read.delim), var_names) # 将列表中的每个数据框导出到全局环境 list2env(df_list, envir = .GlobalEnv)
关键注意事项
- 始终使用
read.delim保持和原代码一致的读取规则,避免列数识别错误 list.files的pattern用\\.txt$,避免匹配文件名中包含"txt"的非目标文件- 若不需要统一变量名,可跳过变量名生成步骤,直接用
gsub("\\.txt$", "", basename(txt_files))作为变量名
内容的提问来源于stack exchange,提问作者Jenn0804
相关产品推荐
相关产品推荐

