如何将 excel 文件命名为 R 列表中数据框的名称
How to name excel files as the names of the data frames in a list in R
我有一个包含 100 多个数据框的大列表。为了简化,我显示了一个包含三个数据框(虚拟数据)的列表。我想使用 openxlsx 将每个数据帧写入一个 excel 文件。我已经创建了一个循环,其中每个数据框都在 excel 文件中,但我想将每个 excel 文件命名为数据框的名称。如何让每个 excel 文件命名为列表中的数据框?
所以 DF1
应该变成 DF1.xlsx。 DF2
应该变成 DF2.xlsx。 DF
在每个 excel 文件名称为 1,2 或 3 时应变为 DF3.xlsx.But。
我的循环:
for (i in (1:3)) {write.xlsx(listDF[i],file=paste(i,".xlsx"))}
# dummy data
listDF <- list(
DF1 = data.frame(
sample = c("TGX", "TGX", "TGX", "TGX"),
RC = c(0, 1, 2, 3),
medRC = c(0, 3, 4, 0),
RC.norm = c(0, 3, 3, 3),
medRC.norm = c(0, 3, 3, 3)
),
DF2 = data.frame(
sample = c("TBF", "TBF", "TBF", "TBF"),
RC = c(2, 1, 2, 3),
medRC = c(4, 3, 4, 0),
RC.norm = c(1, 3, 3, 3),
medRC.norm = c(0, 3, 3, 3)
),
DF3 = data.frame(
sample = c("TZW", "TZW", "TZW", "TZW"),
RC = c(4, 3, 2, 3),
medRC = c(1, 3, 2, 0),
RC.norm = c(1, 1, 1, 1),
medRC.norm = c(0, 7, 5, 3)
)
listDF
# $DF1
# sample RC medRC RC.norm medRC.norm
# 1 TGX 0 0 0 0
# 2 TGX 1 3 3 3
# 3 TGX 2 4 3 3
# 4 TGX 3 0 3 3
# $DF2
# sample RC medRC RC.norm medRC.norm
# 1 TBF 2 4 1 0
# 3 TBF 1 3 3 3
# 4 TBF 2 4 3 3
# 5 TBF 3 0 3 3
# $DF3
# sample RC medRC RC.norm medRC.norm
# 1 TZW 4 1 1 0
# 2 TZW 3 3 1 7
# 3 TZW 2 2 1 5
# 4 TZW 3 0 1 3
可以使用 names()
访问列表元素的名称
names(listDF)
[1] "DF1" "DF2" "DF3"
您的循环需要修改为:
for (i in (1:3)) {write.xlsx(listDF[i],file=paste0(names(listDF)[i],".xlsx"))}
另请注意,使用 paste
会在您的 DF 名称和 .xlsx 之间生成一个空格。使用 paste0
丢弃空格。
您可以使用 purrr
的 imap
来访问数据和名称。
purrr::imap(listDF, ~openxlsx::write.xlsx(.x, paste0(.y, '.xlsx')))
或在基础中使用 Map
:
Map(openxlsx::write.xlsx, listDF, paste0(names(listDF), '.xlsx'))
要从 R 中的列表中检索名称,您可以 运行:
df_names <- names(listDF)
然后你可以在你的循环中使用它们:
for (i in (1:length(listDF))) {
write.xlsx(listDF[[i]],
file = paste0(df_names[i], ".xlsx"))
}
请注意,您可以将数据框称为 listDF[[]]
(对 return 一个 data.frame,而不是列表,请参阅 documentation) and it's generally better to store files without spaces, so use paste0
instead of paste
(see the documentation)。
lapply
如果您想使用 lapply
,可能需要编写类似 lapply(listDF, function(i) {...})
的函数,其中 i
是您的数据框。
或者,您可以像这样遍历索引并在 lapply
中获取数据帧名称:
lapply(seq_along(listDF),
function(i) {write.xlsx(listDF[[i]],
paste0(names(listDF)[[i]], ".xlsx"))
}
)
我有一个包含 100 多个数据框的大列表。为了简化,我显示了一个包含三个数据框(虚拟数据)的列表。我想使用 openxlsx 将每个数据帧写入一个 excel 文件。我已经创建了一个循环,其中每个数据框都在 excel 文件中,但我想将每个 excel 文件命名为数据框的名称。如何让每个 excel 文件命名为列表中的数据框?
所以 DF1
应该变成 DF1.xlsx。 DF2
应该变成 DF2.xlsx。 DF
在每个 excel 文件名称为 1,2 或 3 时应变为 DF3.xlsx.But。
我的循环:
for (i in (1:3)) {write.xlsx(listDF[i],file=paste(i,".xlsx"))}
# dummy data
listDF <- list(
DF1 = data.frame(
sample = c("TGX", "TGX", "TGX", "TGX"),
RC = c(0, 1, 2, 3),
medRC = c(0, 3, 4, 0),
RC.norm = c(0, 3, 3, 3),
medRC.norm = c(0, 3, 3, 3)
),
DF2 = data.frame(
sample = c("TBF", "TBF", "TBF", "TBF"),
RC = c(2, 1, 2, 3),
medRC = c(4, 3, 4, 0),
RC.norm = c(1, 3, 3, 3),
medRC.norm = c(0, 3, 3, 3)
),
DF3 = data.frame(
sample = c("TZW", "TZW", "TZW", "TZW"),
RC = c(4, 3, 2, 3),
medRC = c(1, 3, 2, 0),
RC.norm = c(1, 1, 1, 1),
medRC.norm = c(0, 7, 5, 3)
)
listDF
# $DF1
# sample RC medRC RC.norm medRC.norm
# 1 TGX 0 0 0 0
# 2 TGX 1 3 3 3
# 3 TGX 2 4 3 3
# 4 TGX 3 0 3 3
# $DF2
# sample RC medRC RC.norm medRC.norm
# 1 TBF 2 4 1 0
# 3 TBF 1 3 3 3
# 4 TBF 2 4 3 3
# 5 TBF 3 0 3 3
# $DF3
# sample RC medRC RC.norm medRC.norm
# 1 TZW 4 1 1 0
# 2 TZW 3 3 1 7
# 3 TZW 2 2 1 5
# 4 TZW 3 0 1 3
可以使用 names()
names(listDF)
[1] "DF1" "DF2" "DF3"
您的循环需要修改为:
for (i in (1:3)) {write.xlsx(listDF[i],file=paste0(names(listDF)[i],".xlsx"))}
另请注意,使用 paste
会在您的 DF 名称和 .xlsx 之间生成一个空格。使用 paste0
丢弃空格。
您可以使用 purrr
的 imap
来访问数据和名称。
purrr::imap(listDF, ~openxlsx::write.xlsx(.x, paste0(.y, '.xlsx')))
或在基础中使用 Map
:
Map(openxlsx::write.xlsx, listDF, paste0(names(listDF), '.xlsx'))
要从 R 中的列表中检索名称,您可以 运行:
df_names <- names(listDF)
然后你可以在你的循环中使用它们:
for (i in (1:length(listDF))) {
write.xlsx(listDF[[i]],
file = paste0(df_names[i], ".xlsx"))
}
请注意,您可以将数据框称为 listDF[[]]
(对 return 一个 data.frame,而不是列表,请参阅 documentation) and it's generally better to store files without spaces, so use paste0
instead of paste
(see the documentation)。
lapply
如果您想使用 lapply
,可能需要编写类似 lapply(listDF, function(i) {...})
的函数,其中 i
是您的数据框。
或者,您可以像这样遍历索引并在 lapply
中获取数据帧名称:
lapply(seq_along(listDF),
function(i) {write.xlsx(listDF[[i]],
paste0(names(listDF)[[i]], ".xlsx"))
}
)