1

我在 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))

我知道在 Stackoverflow 上有使用 for 循环对我的查询的解决方案。但是,没有使用 apply 系列函数(例如 lapply)来得出答案的解决方案。

感谢使用 lapply 解决此问题的任何帮助。谢谢!

4

2 回答 2

4

问题是ls()返回字符值,而不是数据帧。因此,您使用的任何代码都不会真正访问数据帧本身。另外,使用它是非常危险的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))
)

完成后,您可以像这样简单地使用write.xlsx()openxlsx

library(openxlsx)
write.xlsx(alldf, "text.xlsx")

它也会自动设置名称。

如果您需要从全局环境中构建该列表,您可以执行以下操作:

allobj <- ls()
alldf <- sapply(allobj, get, simplify = FALSE)
alldf <- alldf[sapply(alldf, inherits, "data.frame")]
于 2018-06-05T09:12:55.323 回答
1

首先,我们创建一个空的 .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))
于 2018-06-05T09:12:21.590 回答