R - 加载多个 csv 文件并从名称中删除 .csv

问题描述

我在一个基本目录中有一些文件,我用来存放我所有的 .csv 文件

base_dir <- file.path(path)
file_list <- list.files(path = base_dir,pattern = "*.csv")

我想一次加载所有这些:

for (i in 1:length(file_list)){
  assign(file_list[i],read.csv(paste(base_dir,file_list[i],sep = ""))

)}

但是,这会生成 R 中名称中带有“.csv”的文件

我想做的是加载所有文件,但在加载后删除名称中的“.csv”。

我尝试了以下方法

 for (i in 1:length(file_list)){ assign(file_list[i],read.csv(substr(paste(base_dir,sep = ""),1,nchar(file_list[i]) -4))
 
 )}

但我收到一个错误No such file or directory

有没有办法稍微有效地做到这一点?

解决方法

通常将它们读入一个列表,而不是将它们作为在工作区中漂浮的自由对象。使用 dirSys.glob 生成完整路径名,然后使用 read.csv 读取每个路径名。L 的名称将是路径名,因此将它们缩减为基本名称并删除 .csv 。>

# paths <- dir(path = path,pattern = "\\.csv$",full = TRUE)
paths <- Sys.glob(sprintf("%s/*.csv",path))
L <- Map(read.csv,paths)
names(L) <- sub("\\.csv$","",basename(names(L)))

如果您确实希望它们作为自由浮动对象,请添加以下内容:

list2env(L,.GlobalEnv)
,

我们可以使用 sub 去掉末尾的 .csv

for (i in 1:length(file_list)){
  assign(sub("\\.csv$",basename(file_list[i])),read.csv(paste(base_dir,file_list[i],sep = ""))

    )}

或者另一个选项是file_path_sans_ext

for (i in 1:length(file_list)){
  assign(tools::file_path_sans_ext(basename(file_list[i])),sep = ""))

    )}

OP 代码中产生的错误是因为 substr 应用于“值”部分,即读取文件而不是“x”,即更正后的代码是

for(i in 1:length(file_list)){       
     assign(substr(paste(base_dir,sep = ""),1,nchar(file_list[i]) -4),read.csv(file_list[i])

 )}

另外,如果工作目录不同,最好指定full.names = TRUE

file_list <- list.files(path = base_dir,pattern = "*\\.csv$",full.names = TRUE)