读取多个文件但跟踪哪个文件是 R 中的哪个数据帧

Read multiple files but keep track of which file is which dataframe in R

假设我有这些文件:

N1.xlsx
N2.xlsx
N3.xlsx
N4.xlsx

我希望它们在一个列表中,但每个数据框必须根据读取的文件命名,例如

mylist = 
N1
N2
N3
N4

我正在使用:

fnames =  mixedsort(sort(list.files("filepath", pattern = '*.xlsx', full.names = F)))

mylist <- lapply(fnames, function(x) {
 read_xlsx(paste0(x),  col_names = TRUE)
})

但是这段代码创建了一个没有标识的列表

mylist = 
[[1]]
[[2]]
[[3]]
[[4]]

在每个数据框中保留每个文件的名称很重要,这样我以后才能正确导出它们!

也许

如果您尝试使用您的代码:

fnames =  mixedsort(sort(list.files("filepath", pattern = '*.xlsx', full.names = F)))

mylist <- lapply(fnames, function(x) {
 read_xlsx(paste0(x),  col_names = TRUE)
})

后跟重命名列表元素的函数?

names(mylist)<-str_remove(fnames, '.xlsx')

另一种选择是将重命名步骤包含到创建列表的函数中:

fnames =  mixedsort(sort(list.files("filepath", pattern = '*.xlsx', full.names = F)))

create_list<-function(fnames){
mylist<-lapply(fnames, function(x) {
 read_xlsx(paste0(x),  col_names = TRUE)
})
names(mylist)<-str_remove(fnames, '.xlsx')
}

create_list(fnames)

第一个策略的例子:

mylist<-list(c(1:4), c(1:5), c('a','b'), c('d','e','f'))
fnames<-c("N1.xlsx","N2.xlsx","N3.xlsx","N4.xlsx")

names(mylist)<-str_remove(fnames, '.xlsx')

> mylist
$N1
[1] 1 2 3 4

$N2
[1] 1 2 3 4 5

$N3
[1] "a" "b"

$N4
[1] "d" "e" "f"

有一个名为 libr 的软件包可以完全满足您的要求。您可以在一行代码中完成。语法是这样的:

libname(mylist, "<path to files>", "xlsx")

以上代码将数据放入变量mylist,每个数据集根据文件名命名。

您可以使用您在 fnames 中已有的名称命名 mylist

names(mylist) <- tools::file_path_sans_ext(fnames)
mylist

file_path_sans_ext 从文件名中删除扩展名。

如果你想重命名文件名中的任何内容(例如 N1 any text.xlsx),你可以使用

names(mylist) <- tools::file_path_sans_ext(str_remove(fnames, " any  text"))
mylist

甚至:

names(mylist) <- tools::file_path_sans_ext(str_replace(fnames, " any  text", "other text"))
mylist

一种策略是先使 fnames 没有扩展名,然后 paste0 lapply 中的扩展名,优点是您可以使用 fnamessetNames.

fnames <- gtools::mixedsort(gsub(".xlsx", "", list.files("filepath", pattern="*.xlsx")))
mylist <- setNames(lapply(fnames, function(x)
  openxlsx::read.xlsx(paste0("filepath/", x, ".xlsx"))), fnames)
# $N1
#   X1 X2 X3 X4
# 1  1  4  7 10
# 2  2  5  8 11
# 3  3  6  9 12
# 
# $N2
#   X1 X2 X3 X4
# 1  1  4  7 10
# 2  2  5  8 11
# 3  3  6  9 12
# 
# $N3
#   X1 X2 X3 X4
# 1  1  4  7 10
# 2  2  5  8 11
# 3  3  6  9 12
# 
# $N4
#   X1 X2 X3 X4
# 1  1  4  7 10
# 2  2  5  8 11
# 3  3  6  9 12

注意: 我使用了 openxlsx::read.xlsx,因为您没有引用 read_xlsxlibrary,但这应该有效同样的方法。


数据:

N1 <- N2 <- N3 <- N4 <- data.frame(matrix(1:12, 3, 4))
sapply(ls(pattern="^N"), function(p) 
  openxlsx::write.xlsx(mget(p, envir=.GlobalEnv), paste0("filepath/", p, ".xlsx")))