在 lapply 中使用 write.xlsx 将全局环境中的每个数据框写入单个 Excel 文件的每个选项卡
Using write.xlsx inside lapply to write each data frame in Global Environment to each tab of a single Excel file
我在 R Studio 中的全局环境由多个数据框组成。我想将每个数据框中的数据写入单个 excel 文件中的每个选项卡。
为了使这个问题可重现,让我们考虑全球环境中的以下数据框:
df1 <- data.frame(ID = c("001", "002", "003"), scores = c(5, 7, 6))
df2 <- data.frame(ID = c("001", "002", "003"), scores = c(3, 6, 4))
df3 <- data.frame(ID = c("001", "002", "003"), scores = c(7, 6, 7))
df4 <- data.frame(ID = c("001", "002", "003"), scores = c(4, 3, 7))
所需的输出是一个 excel 文件,有 4 个选项卡,第一个选项卡名为 "df1" 并包含 df1 的数据,依此类推。
我尝试了以下方法,但都不起作用:
lapply(ls(), function(x) write.xlsx(ls(), "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))
lapply(names(ls()), function(x) write.xlsx(ls(), "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))
lapply(names(ls()), function(x) write.xlsx(ls[[x]], "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))
我知道在 Whosebug 上有使用 for 循环的查询解决方案。但是,没有使用 apply 函数族(例如 lapply)得出答案的解决方案。
感谢使用 lapply 解决此问题的任何帮助。谢谢!
首先我们创建一个空的 .xlsx 来附加我们的工作表:
library(xlsx)
wb = xlsx::createWorkbook(type='xlsx')
saveWorkbook(wb,"Overall_Output.xlsx")
rm(wb)#remove wb to avoid it in ls()
然后我们使用 get0() 函数按名称调用每个数据帧:
lapply(ls(), function(x) write.xlsx(get0(x), "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))
问题是 ls()
returns 字符值,而不是数据帧。因此,您使用的 none 代码实际上访问了数据帧本身。另外,使用 ls()
非常危险,因为它会在您的全局环境中添加每个对象。
首先将您的数据框放入列表中:
alldf <- list(
df1 = data.frame(ID = c("001", "002", "003"), scores = c(5, 7, 6)),
df2 = data.frame(ID = c("001", "002", "003"), scores = c(3, 6, 4)),
df3 = data.frame(ID = c("001", "002", "003"), scores = c(7, 6, 7)),
df4 = data.frame(ID = c("001", "002", "003"), scores = c(4, 3, 7))
)
完成后,您可以像这样简单地使用 openxlsx
包的 write.xlsx()
:
library(openxlsx)
write.xlsx(alldf, "text.xlsx")
它也会自动设置名称。
如果您需要从全局环境构建该列表,您可以这样做:
allobj <- ls()
alldf <- sapply(allobj, get, simplify = FALSE)
alldf <- alldf[sapply(alldf, inherits, "data.frame")]
我在 R Studio 中的全局环境由多个数据框组成。我想将每个数据框中的数据写入单个 excel 文件中的每个选项卡。
为了使这个问题可重现,让我们考虑全球环境中的以下数据框:
df1 <- data.frame(ID = c("001", "002", "003"), scores = c(5, 7, 6))
df2 <- data.frame(ID = c("001", "002", "003"), scores = c(3, 6, 4))
df3 <- data.frame(ID = c("001", "002", "003"), scores = c(7, 6, 7))
df4 <- data.frame(ID = c("001", "002", "003"), scores = c(4, 3, 7))
所需的输出是一个 excel 文件,有 4 个选项卡,第一个选项卡名为 "df1" 并包含 df1 的数据,依此类推。
我尝试了以下方法,但都不起作用:
lapply(ls(), function(x) write.xlsx(ls(), "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))
lapply(names(ls()), function(x) write.xlsx(ls(), "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))
lapply(names(ls()), function(x) write.xlsx(ls[[x]], "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))
我知道在 Whosebug 上有使用 for 循环的查询解决方案。但是,没有使用 apply 函数族(例如 lapply)得出答案的解决方案。
感谢使用 lapply 解决此问题的任何帮助。谢谢!
首先我们创建一个空的 .xlsx 来附加我们的工作表:
library(xlsx)
wb = xlsx::createWorkbook(type='xlsx')
saveWorkbook(wb,"Overall_Output.xlsx")
rm(wb)#remove wb to avoid it in ls()
然后我们使用 get0() 函数按名称调用每个数据帧:
lapply(ls(), function(x) write.xlsx(get0(x), "Overall_Output.xlsx", sheetName = x, append = TRUE, col.names = TRUE, row.names = FALSE, showNA = FALSE))
问题是 ls()
returns 字符值,而不是数据帧。因此,您使用的 none 代码实际上访问了数据帧本身。另外,使用 ls()
非常危险,因为它会在您的全局环境中添加每个对象。
首先将您的数据框放入列表中:
alldf <- list(
df1 = data.frame(ID = c("001", "002", "003"), scores = c(5, 7, 6)),
df2 = data.frame(ID = c("001", "002", "003"), scores = c(3, 6, 4)),
df3 = data.frame(ID = c("001", "002", "003"), scores = c(7, 6, 7)),
df4 = data.frame(ID = c("001", "002", "003"), scores = c(4, 3, 7))
)
完成后,您可以像这样简单地使用 openxlsx
包的 write.xlsx()
:
library(openxlsx)
write.xlsx(alldf, "text.xlsx")
它也会自动设置名称。
如果您需要从全局环境构建该列表,您可以这样做:
allobj <- ls()
alldf <- sapply(allobj, get, simplify = FALSE)
alldf <- alldf[sapply(alldf, inherits, "data.frame")]