在Lappy中使用write.xlsx将全局环境中的每个数据帧写入单个Excel文件的每个选项卡

在Lappy中使用write.xlsx将全局环境中的每个数据帧写入单个Excel文件的每个选项卡,r,lapply,r-xlsx,R,Lapply,R Xlsx,我在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.fram

我在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))
我知道在Stackoverflow上有使用for循环的查询解决方案。但是,没有使用apply函数族(如Lappy)得出答案的解决方案


感谢使用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))

首先,我们创建一个空的.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()
返回的是字符值,而不是数据帧。因此,您使用的所有代码实际上都不会访问数据帧本身。另外,使用
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))
)
它还将自动设置名称

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

library(openxlsx)
write.xlsx(alldf, "text.xlsx")
allobj <- ls()
alldf <- sapply(allobj, get, simplify = FALSE)
alldf <- alldf[sapply(alldf, inherits, "data.frame")]

allobj问题在于
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))
)
它还将自动设置名称

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

library(openxlsx)
write.xlsx(alldf, "text.xlsx")
allobj <- ls()
alldf <- sapply(allobj, get, simplify = FALSE)
alldf <- alldf[sapply(alldf, inherits, "data.frame")]
allobj