读取多个文件但跟踪哪个文件是 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
中的扩展名,优点是您可以使用 fnames 到 setNames
.
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_xlsx
的 library
,但这应该有效同样的方法。
数据:
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")))
假设我有这些文件:
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
中的扩展名,优点是您可以使用 fnames 到 setNames
.
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_xlsx
的 library
,但这应该有效同样的方法。
数据:
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")))