使用R在同一Excel工作表中优雅地输出多个数据帧

时间:2015-04-16 16:37:25

标签: r export-to-excel

我目前正在尝试在同一个Excel工作表中输出多个R数据框。 我有一个生成270个表的脚本。基本上,我想以这种方式对表格进行分组:

  • 每张15张表
  • 每个文件6张
  • 3个文件。

我想过按照以下方式对它们进行分组:

  • 每张1张表
  • 每个文件15张
  • 每个目录6个文件
  • 3个目录

但这意味着我必须在工作时在每个文件之间跳转,这实际上并不实际。我还考虑过使用cbindsrbinds在一个数据框中对15个表集进行分组,并使用空行/列来标记它们之间的分隔。但是,我对这个解决方案并不满意,因为它不是很优雅。

我不知道是否有任何软件包可以执行此操作,或者xslx / Rexcel软件包是否可以,但我还没有找到它。当我试图找到这个问题的答案时,我只找到关于在不同的Excel表格中写作的主题。

如果有人有解决方案,我很高兴知道它:)。

1 个答案:

答案 0 :(得分:1)

我最近离开了 XLConnect ,但过去我使用了类似下面的功能来做这类事情。

require(XLConnect)
write_excel_gap <- function(path = NULL,
                            data_list = NULL,
                            gap = 1,
                            sheet = "Sheet1",
                            header = TRUE,
                            firstRow = 1,
                            add = FALSE,
                            addSheet = TRUE,
                            style = TRUE,...){

    stopifnot(length(gap) > 0,!is.null(path),!is.null(data_list))

    if (add){
        wb <- loadWorkbook(path,create = FALSE)
    }else{
        wb <- loadWorkbook(path,create = TRUE)
    }

    if (addSheet){
        createSheet(wb,sheet)
    }
    if (!style){
        setStyleAction(wb,XLC$"STYLE_ACTION.NONE")
    }

    n <- length(data_list)
    ng <- length(gap)
    dl_rows <- sapply(data_list,nrow)

    if (ng == 1){
        sr <- c(firstRow,firstRow + head(cumsum(dl_rows),-1)) + 
            c(0,cumsum(rep(gap,n-1)))
    }else{
        if(ng != n-1){
            warning("Length of gap is not one less than length of data_list. 
                            \nGap will be recycled as needed.")
        }
        sr <- c(firstRow,firstRow + head(cumsum(dl_rows),-1)) + 
            c(0,cumsum(gap))
    }

    if (header){
        writeWorksheet(object=wb,
                       data=data_list[[1]],
                       sheet=sheet,
                       startRow=firstRow,
                       header = TRUE,...)
        sr <- sr[-1] + 1
        writeWorksheet(object = wb,
                       data = data_list[-1],
                       sheet = sheet,
                       startRow = sr,
                       header = FALSE,...)
    }else{
        writeWorksheet(object = wb,
                       data = data_list,
                       sheet = sheet,
                       startRow = sr,
                       header = FALSE,...)
    }
    saveWorkbook(wb)
 }