提问人:Ogre Magi 提问时间:12/31/2014 最后编辑:zx8754Ogre Magi 更新时间:6/9/2021 访问量:287374
将多个 data.frame 导出到多个 Excel 工作表的简单方法
Easy way to export multiple data.frame to multiple Excel worksheets
问:
我惊讶地发现没有简单的方法可以将多个 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);
}
我可以导出到多个 cvs 文件,但必须有一种简单的方法可以在 Excel 中做到这一点,对吧?
答:
我不熟悉这个包;我一般使用: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)
如上所述,这当然可以矢量化@joran,但为了快速生成动态工作表名称,我使用了一个循环来演示。for
我在创建新的 .xlsx 文件时使用了该参数,但是如果您的文件已经存在,则不必指定此参数,因为默认值为 .create=TRUE
loadWorkbook
FALSE
以下是已创建工作簿的一些屏幕截图:
评论
您可以使用包写入多个工作表。您只需要为每个数据框使用不同的数据框,并且需要添加: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)
另一个选项是,在 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")
如果您觉得它有用,这里有一些有趣的辅助函数,可以更轻松地使用以下命令向电子表格添加格式、元数据和其他功能: http://www.sthda.com/english/wiki/r2excel-read-write-and-format-easily-excel-files-using-r-softwarexlsx
评论
row.names=FALSE
xlsx
openxlsx
您还可以使用 openxlsx 库将多个数据集导出到单个工作簿中的多个工作表。openxlsx 相对于 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")
评论
openxlsx
XlConnect
xlsx
openxlsx
openxlsx::write.xlsx
xlsx::write.xlsx
java.lang.OutOfMemoryError: Java heap space
append=TRUE
list_of_dfs <- list()
list_of_dfs[[temp_key]] = temp_df
对我来说,提供了您正在寻找的功能。由于您没有指定它返回哪些错误,因此我向您展示一个示例:WriteXLS
例
library(WriteXLS)
x <- list(sheet_a = data.frame(a=letters), sheet_b = data.frame(b = LETTERS))
WriteXLS(x, "test.xlsx", names(x))
解释
如果是:x
- 数据帧列表,每个数据帧都写入单个工作表
- 一个字符向量(R 对象),每个对象都写入单个工作表
- 别的东西,然后另见帮助说明的内容:
有关使用的更多信息
?WriteXLS
显示:
`x`: A character vector or factor containing the names of one or
more R data frames; A character vector or factor containing
the name of a single list which contains one or more R data
frames; a single list object of one or more data frames; a
single data frame object.
溶液
对于您的示例,您需要在循环期间收集列表中的所有 data.frames,并在循环完成后使用。WriteXLS
会议信息
- 建议 3.2.4
- 写入XLS 4.0.0
评论
xlsx
如果数据量很小,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
Sys.setenv(“R_ZIPCMD” = “C:/Rtools/bin/zip.exe”) 必须是静态的,因为它引用了 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
OpenXLSX 包非常适合从 Excel 文件中读取和写入大量数据,并且有很多用于在 Excel 中自定义格式的选项。
有趣的事实是,我们在这里不必为java堆内存而烦恼。
镇上有一个来自 rOpenSci 的新库:writexl
基于 xlsx 导出器的便携式轻量级数据帧 libxlsxwriter 中。无需 Java 或 Excel
我发现它比上述建议更好更快(使用开发版本):
library(writexl)
sheets <- list("sheet1Name" = sheet1, "sheet2Name" = sheet2) #assume sheet1 and sheet2 are data frames
write_xlsx(sheets, "path/to/location")
评论
我使用以下函数以这种方式为 openxlsx 执行此操作
mywritexlsx<-function(fname="temp.xlsx",sheetname="Sheet1",data,
startCol = 1, startRow = 1, colNames = TRUE, rowNames = FALSE)
{
if(! file.exists(fname))
wb = createWorkbook()
else
wb <- loadWorkbook(file =fname)
sheet = addWorksheet(wb, sheetname)
writeData(wb,sheet,data,startCol = startCol, startRow = startRow,
colNames = colNames, rowNames = rowNames)
saveWorkbook(wb, fname,overwrite = TRUE)
}
评论
这里有很多很好的答案,但其中一些有点过时了。如果您想将更多工作表添加到单个文件,那么这是我发现适合我的方法。为清楚起见,以下是版本 4.0 的工作流openxlsx
# 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")
编辑
我现在已经尝试了其他一些答案,我真的很喜欢@Syed的答案。它没有利用所有功能,但如果您想要一种快速简便的导出方法,那么这可能是最直接的。openxlsx
我一直在这样做,我所做的只是
WriteXLS::WriteXLS(
all.dataframes,
ExcelFileName = xl.filename,
AdjWidth = T,
AutoFilter = T,
FreezeRow = 1,
FreezeCol = 2,
BoldHeaderRow = T,
verbose = F,
na = '0'
)
所有这些数据帧都来自这里
all.dataframes <- vector()
for (obj.iter in all.objects) {
obj.name <- obj.iter
obj.iter <- get(obj.iter)
if (class(obj.iter) == 'data.frame') {
all.dataframes <- c(all.dataframes, obj.name)
}
显然,sapply 例程在这里会更好
对于 lapply 友好的版本..
library(data.table)
library(xlsx)
path2txtlist <- your.list.of.txt.files
wb <- createWorkbook()
lapply(seq_along(path2txtlist), function (j) {
sheet <- createSheet(wb, paste("sheetname", j))
addDataFrame(fread(path2txtlist[j]), sheet=sheet, startColumn=1, row.names=FALSE)
})
saveWorkbook(wb, "My_File.xlsx")
评论
我遇到了这个确切的问题,我是这样解决的:
library(openxlsx) # loads library and doesn't require Java installed
your_df_list <- c("df1", "df2", ..., "dfn")
for(name in your_df_list){
write.xlsx(x = get(name),
file = "your_spreadsheet_name.xlsx",
sheetName = name)
}
这样,如果您有大量数据帧要写入 Excel,则不必手动创建很长的列表。
评论
我经常使用包装好的里约热内卢进行各种出口。使用 rio,您可以输入一个列表,命名每个选项卡并指定数据集。rio 编译其他 in/out 包,并且为了导出到 Excel,使用 openxlsx。
library(rio)
filename <- "C:/R_code/../file.xlsx"
export(list(sn1 = tempTable1, sn2 = tempTable2, sn3 = tempTable3), filename)
评论
获取一个数据帧并按组编写工作表的整洁方法:
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)))
上一个:制作包含多篇文章标题列表的尾注库
下一个:无法从字符串中删除尾随空格
评论
createSheet