在 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")]