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

R - load multiple csv files and drop .csv from name

我在用于存放所有 .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, file_list[i], sep = ""), 1,
 nchar(file_list[i]) -4))
 
 )}

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

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

我们可以用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])),
       read.csv(paste(base_dir, file_list[i], sep = ""))

    )}

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

for(i in 1:length(file_list)){       
     assign(substr(paste(base_dir, file_list[i], 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)

通常将它们读入列表,而不是将它们作为自由对象在工作区中浮动。使用 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)