You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量导入多个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

报错原因

  1. 替换了原代码的read.delim为read.table,两者默认参数差异导致读取失败:
    • read.delim默认sep="\t"(制表符分隔)、header=TRUE(第一行是列名)
    • read.table默认sep=""(任意空白分隔)、header=FALSE,无法正确识别制表符分隔的文件列数,触发报错。
  2. 错误地将读取结果转成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:43:32