问题描述
我在一个基本目录中有一些文件,我用来存放我所有的 .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 = ""))
)}
我想做的是加载所有文件,但在加载后删除名称中的“.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
有没有办法稍微有效地做到这一点?
解决方法
通常将它们读入一个列表,而不是将它们作为在工作区中漂浮的自由对象。使用 dir
或 Sys.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)