代码之家  ›  专栏  ›  技术社区  ›  DTYK

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

  •  1
  • DTYK  · 技术社区  · 8 年前

    我在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循环的查询解决方案。然而,在应用函数族(如lapply)来获得答案的情况下,还没有解决方案。

    感谢使用lapply来解决这个问题。谢谢!

    2 回复  |  直到 8 年前
        1
  •  1
  •   tyumru    8 年前

    首先,我们创建一个空的.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))
    
        2
  •  2
  •   Joris Meys    8 年前

    问题是 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")]
    
    推荐文章