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