使用标题上方的标题将数据写入excel - R

ds_*_*ser 1 r

这是我的 excel 输出在一张纸中的样子,

Total Expenses

Region Jan-18 Feb-18 Mar-18 
Reg1   32     65     56
Reg2   24     45     89
Reg3   15     78     23

Average Expenses

Region Jan-18 Feb-18 Mar-18
Reg1    12    14     13
Reg2    13    15     14
Reg3    11    14     12
Run Code Online (Sandbox Code Playgroud)

我使用 rbind 在 R 中构建它,首先添加带有相应数据集的标题,然后添加空行,然后添加数据集。然而,通过这样做,我失去了实际数据的数字性质。我们可以在为我的数字保留数字数据类型的同时做到这一点吗?

注意:以上是要在一张 Excel 中写入的示例数据,同样我正在构建 4 个不同的表作为数据框列表并使用 write.xlsx 输出它们。

dig*_*All 5

这是一个使用 xlsx 包的工作示例:

totExpenses <- data.frame('Region'=c('Reg1','Reg2','Reg3'),
                          'Jan-18'=c(32,24,15),
                          'Feb-18'=c(65,45,78),
                          'Mar-18'=c(56,89,23),check.names=FALSE)
avgExpenses <- data.frame('Region'=c('Reg1','Reg2','Reg3'),
                          'Jan-18'=c(12,13,11),
                          'Feb-18'=c(14,15,14),
                          'Mar-18'=c(13,14,12),check.names=FALSE)


library(xlsx)

wb <- createWorkbook()
sh <- createSheet(wb,"mySheet")
row <- 1
addDataFrame(data.frame("Total Expenses"=double(),check.names=FALSE),
             sheet = sh,startRow=row,row.names=FALSE)
row <- row + 2
addDataFrame(totExpenses,sheet=sh,startRow=row,row.names=FALSE)
row <- row + nrow(totExpenses) + 2
addDataFrame(data.frame("Average Expenses"=double(),check.names=FALSE),
             sheet=sh,startRow=row,row.names=FALSE)
row <- row + 2
addDataFrame(avgExpenses,sheet=sh,startRow=row,row.names=FALSE)
saveWorkbook(wb,file='myfile.xlsx')
Run Code Online (Sandbox Code Playgroud)

结果 :

在此处输入图片说明


这是一个自定义函数,它采用 data.frame 的命名列表并将它们写入具有所需结构的 Excel 工作表:

writeListOfDFToSheet <- function(lst,workBook,sheetName){

  sh <- createSheet(workBook,sheetName)

  # force names in list if not present
  if(is.null(names(lst))) 
    names(lst) <- rep.int("",length(lst))
  names(lst) <- ifelse(names(lst) == "",paste("data.frame",1:length(lst)),names(lst))

  row <- 1
  for(i in seq_len(length(lst))){
    DFName <- names(lst)[i]
    DF <- as.data.frame(lst[[i]])

    # header
    addDataFrame(setNames(data.frame(x=logical()),DFName),
                 sheet=sh,startRow=row,row.names=FALSE)
    row <- row + 2

    # data.frame
    addDataFrame(DF,
                 sheet=sh,startRow=row,row.names=FALSE)
    row <- row + nrow(DF) + 2
  }

  invisible(NULL)
}
Run Code Online (Sandbox Code Playgroud)

使用示例(假设定义了前 2 个 data.frame):

# create a workbook 
wb <- createWorkbook()

# write to "sheet 1" 
lst1 <- list("Total Expenses"=totExpenses,"Average Expenses"=avgExpenses)
writeListOfDFToSheet(lst1,wb,"sheet 1")

# write to "sheet 2" 
# (I'm using the same data.frame's but it's just an example)
lst2 <- list("Total Expenses"=totExpenses,"Average Expenses"=avgExpenses)
writeListOfDFToSheet(lst2,wb,"sheet 2")

# save excel file
saveWorkbook(wb,file='myfile.xlsx')
Run Code Online (Sandbox Code Playgroud)