R:将多个data.frame导出到多个excel工作表的简便方法?

Ogr*_*agi 61 excel r xlsx

我很惊讶地发现没有简单的方法将多个data.frame导出到excel文件的多个工作表中?我试过xlsx包,看来它只能写一张表(覆盖旧表); 我也试过WriteXLS包,但它一直给我错误...

我的代码结构是这样的:按照设计,对于每次迭代,输出数据帧(tempTable)和sheetName(sn)都已更新并导出到一个选项卡中.

for (i in 2 : ncol(code)){ 
        ...
        tempTable <- ...
        sn <- ...
        WriteXLS("tempTable", ExcelFileName = "C:/R_code/../file.xlsx",
              SheetNames = sn);
}
Run Code Online (Sandbox Code Playgroud)

我可以导出到几个cvs文件,但在excel中必须有一个简单的方法,对吧?

提前致谢.

eip*_*i10 120

您可以使用xlsx包写入多个工作表.您只需要sheetName为每个数据框使用不同的,您需要添加append=TRUE:

library(xlsx)
write.xlsx(dataframe1, file="filename.xlsx", sheetName="sheet1", row.names=FALSE)
write.xlsx(dataframe2, file="filename.xlsx", sheetName="sheet2", append=TRUE, row.names=FALSE)
Run Code Online (Sandbox Code Playgroud)

另一个选项,一个可以让您更好地控制格式和数据框放置位置的选项,是在R/xlsx代码中执行所有操作,然后在最后保存工作簿.例如:

wb = createWorkbook()

sheet = createSheet(wb, "Sheet 1")

addDataFrame(dataframe1, sheet=sheet, startColumn=1, row.names=FALSE)
addDataFrame(dataframe2, sheet=sheet, startColumn=10, row.names=FALSE)

sheet = createSheet(wb, "Sheet 2")

addDataFrame(dataframe3, sheet=sheet, startColumn=1, row.names=FALSE)

saveWorkbook(wb, "My_File.xlsx")
Run Code Online (Sandbox Code Playgroud)

如果你觉得它很有用,这里有一些有趣的辅助函数,可以更容易地使用以下格式向电子表格添加格式,元数据和其他功能xlsx:http: //www.sthda.com/english/wiki/r2excel-read-write -和格式,易于Excel的文件-使用-R软件

  • 是只有我一个人这样,还是当使用此代码时,工作表 2 只是简单地覆盖工作表 1? (7认同)
  • 添加 `row.names=FALSE` 以删除行名称。 (2认同)
  • @EcologyTom 我不久前从`xlsx` 切换到`openxlsx`,因为我发现它更直观,而且还避免了java 依赖。 (2认同)

小智 58

您还可以使用openxlsx库将多个数据集导出到单个工作簿中的多个工作表.opexxlsx优于xlsx的优点是openxlsx删除了对java库的依赖关系.

使用列表名称作为工作表名称,将data.frames列表写入单个工作表.

require(openxlsx)
list_of_datasets <- list("Name of DataSheet1" = dataframe1, "Name of Datasheet2" = dataframe2)
write.xlsx(list_of_datasets, file = "writeXLSX2.xlsx")
Run Code Online (Sandbox Code Playgroud)

  • 我已经使用过这些包,我认为 `openxlsx` 是最快的 C++。`XlConnect` 会吃掉你的 RAM。你可能想在 `xlsx` 和 `openxlsx` 之间做一些基准测试 (3认同)
  • 该包的另一个优点是它负责处理第一行中的 R 编号。 (2认同)
  • 谢谢,`openxlsx :: write.xlsx`是要走的路...我保存了11张,每张20,000x10数据帧,完成了几秒钟,而`xlsx :: write.xlsx`在追加第二张后出错了使用`java.lang.OutOfMemoryError:Java堆空间`的工作表 (2认同)

Gio*_*oni 21

镇上有一个新的图书馆,来自rOpenSci:writexl

基于libxlsxwriter的xlsx导出器的便携,轻量级数据框架.不需要Java或Excel

我发现它比上面的建议更好,更快(使用开发版本):

library(writexl)
sheets <- list("sheet1Name" = sheet1, "sheet2Name" = sheet2) #assume sheet1 and sheet2 are data frames
write_xlsx(sheets, "path/to/location")
Run Code Online (Sandbox Code Playgroud)


Eco*_*Tom 14

这里有很多好的答案,但其中一些有点过时了.如果您想将更多工作表添加到单个文件中,那么这就是我觉得适合我的方法.为清楚起见,这是openxlsx4.0版的工作流程

# Create a blank workbook
OUT <- createWorkbook()

# Add some sheets to the workbook
addWorksheet(OUT, "Sheet 1 Name")
addWorksheet(OUT, "Sheet 2 Name")

# Write the data to the sheets
writeData(OUT, sheet = "Sheet 1 Name", x = dataframe1)
writeData(OUT, sheet = "Sheet 2 Name", x = dataframe2)

# Export the file
saveWorkbook(OUT, "My output file.xlsx")
Run Code Online (Sandbox Code Playgroud)

编辑

我现在已经尝试了其他一些答案,我其实非常喜欢@ Syed的.它没有利用所有的功能,openxlsx但如果你想要一个快速简便的导出方法,那么这可能是最直接的.


nru*_*ell 8

我对包裹不熟悉WriteXLS; 我一般用XLConnect:

library(XLConnect)
##
newWB <- loadWorkbook(
  filename="F:/TempDir/tempwb.xlsx",
  create=TRUE)
##
for(i in 1:10){
  wsName <- paste0("newsheet",i)
  createSheet(
    newWB,
    name=wsName)
  ##
  writeWorksheet(
    newWB,
    data=data.frame(
      X=1:10,
      Dataframe=paste0("DF ",i)),
    sheet=wsName,
    header=TRUE,
    rownames=NULL)
}
saveWorkbook(newWB)
Run Code Online (Sandbox Code Playgroud)

这肯定可以像@joran上面提到的那样进行矢量化,但仅仅是为了快速生成动态工作表名称,我使用for循环来演示.

我使用了这个create=TRUE参数,loadWorkbook因为我创建了一个新的.xlsx文件,但是如果你的文件已经存在,那么你不必指定它,因为默认值是FALSE.

以下是创建的工作簿的一些屏幕截图:

在此输入图像描述

在此输入图像描述

在此输入图像描述


小智 7

我经常使用打包的rio来导出各种类型的内容。使用 rio,您可以输入一个列表,命名每个选项卡并指定数据集。rio 编译其他输入/输出包,并使用 openxlsx 导出到 Excel。

library(rio)

filename <- "C:/R_code/../file.xlsx"

export(list(sn1 = tempTable1, sn2 = tempTable2, sn3 = tempTable3), filename)
Run Code Online (Sandbox Code Playgroud)


ayu*_*ney 5

如果数据量很小,R具有许多可根据您的要求使用的软件包和功能。

write.xlsx,write.xlsx2,XLconnect也可以完成工作,但是与openxlsx相比,这些有时速度较慢

因此,如果您处理的是大型数据集,并且遇到了Java错误。我建议看看“ openxlsx”,它真的很棒,可以将时间减少到1/12

我已经进行了全部测试,最后,openxlsx功能的性能给我留下了深刻的印象。

以下是将多个数据集写入多个工作表的步骤。

 install.packages("openxlsx")
 library("openxlsx")

    start.time <- Sys.time()

    # Creating large data frame
    x <- as.data.frame(matrix(1:4000000,200000,20))
    y <- as.data.frame(matrix(1:4000000,200000,20))
    z <- as.data.frame(matrix(1:4000000,200000,20))

    # Creating a workbook
    wb <- createWorkbook("Example.xlsx")
    Sys.setenv("R_ZIPCMD" = "C:/Rtools/bin/zip.exe") ## path to zip.exe
Run Code Online (Sandbox Code Playgroud)

Sys.setenv(“ R_ZIPCMD” =“ C:/Rtools/bin/zip.exe”)必须是静态的,因为它引用了Rtools的某些实用程序。

注意:如果您的系统上未安装Rtools,请先安装Rtools以获得流畅的体验。这是供您参考的链接:(选择适当的版本)

https://cran.r-project.org/bin/windows/Rtools/ 根据下面的链接检查选项(安装时需要选中所有复选框)

https://cloud.githubusercontent.com/assets/7400673/12230758/99fb2202-b8a6-11e5-82e6-836159440831.png

    # Adding a worksheets : parameters for addWorksheet are 1. Workbook Name 2. Sheet Name

    addWorksheet(wb, "Sheet 1")
    addWorksheet(wb, "Sheet 2")
    addWorksheet(wb, "Sheet 3")

    # Writing data in to respetive sheets: parameters for writeData are 1. Workbook Name 2. Sheet index/ sheet name 3. dataframe name

    writeData(wb, 1, x)

    # incase you would like to write sheet with filter available for ease of access you can pass the parameter withFilter = TRUE in writeData function.
    writeData(wb, 2, x = y, withFilter = TRUE)

    ## Similarly writeDataTable is another way for representing your data with table formatting:

    writeDataTable(wb, 3, z)

    saveWorkbook(wb, file = "Example.xlsx", overwrite = TRUE)

    end.time <- Sys.time()
    time.taken <- end.time - start.time
    time.taken
Run Code Online (Sandbox Code Playgroud)

openxlsx软件包非常适合从excel文件中读取/写入大量数据,并且在excel中具有许多用于自定义格式的选项。

有趣的事实是,我们在这里不必担心Java堆内存。


小智 5

获取一个数据框并按组编写表格的整洁方法:

library(tidyverse)
library(xlsx)
mtcars %>% 
  mutate(cyl1 = cyl) %>% 
  group_by(cyl1) %>% 
  nest() %>% 
  ungroup() %>% 
  mutate(rn = row_number(),
         app = rn != 1,
         q = pmap(list(rn,data,app),~write.xlsx(..2,"test1.xlsx",as.character(..1),append = ..3)))
Run Code Online (Sandbox Code Playgroud)