使用 R 在同一个 Excel sheet 中优雅地输出多个数据帧
Elegantly output several dataframes in the same Excel sheet with R
我目前正在尝试在同一个 Excel Sheet 中输出多个 R 数据帧。
我有一个生成 270 tables 的脚本。基本上,我想这样对 tables 进行分组:
- 15 table 秒每 sheet
- 每个文件 6 sheet 秒
- 3 个文件。
我考虑过按以下方式对它们进行分组:
- 1 table 每 sheet
- 每个文件 15 sheet 秒
- 每个目录 6 个文件
- 3 个目录
但这意味着我必须在工作时在每个文件之间跳转,这不太实用。我还考虑过使用 cbinds
和 rbinds
将 15 tables 集合分组在一个数据框中,并使用空 rows/columns 来标记它们之间的分隔。但是,我对这个解决方案并不满意,因为它不是很优雅。
我不知道是否有任何软件包提供了这样做的可能性,或者 xslx/Rexcel 软件包是否提供了这种可能性,但我还没有找到它。当我试图找到这个问题的答案时,我只找到关于在不同 Excel sheets.
中写作的话题
如果有人知道解决方案,我们会很高兴:)。
我最近离开了 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)
}
我目前正在尝试在同一个 Excel Sheet 中输出多个 R 数据帧。 我有一个生成 270 tables 的脚本。基本上,我想这样对 tables 进行分组:
- 15 table 秒每 sheet
- 每个文件 6 sheet 秒
- 3 个文件。
我考虑过按以下方式对它们进行分组:
- 1 table 每 sheet
- 每个文件 15 sheet 秒
- 每个目录 6 个文件
- 3 个目录
但这意味着我必须在工作时在每个文件之间跳转,这不太实用。我还考虑过使用 cbinds
和 rbinds
将 15 tables 集合分组在一个数据框中,并使用空 rows/columns 来标记它们之间的分隔。但是,我对这个解决方案并不满意,因为它不是很优雅。
我不知道是否有任何软件包提供了这样做的可能性,或者 xslx/Rexcel 软件包是否提供了这种可能性,但我还没有找到它。当我试图找到这个问题的答案时,我只找到关于在不同 Excel sheets.
中写作的话题如果有人知道解决方案,我们会很高兴:)。
我最近离开了 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)
}