使用write.xlsx处理空数据帧
在循环中使用write.xlsx时,如何处理空数据帧 下面是循环的样子,其中source(“./Scripts/Analysis\u details.R”)引用了创建数据帧的R文件使用write.xlsx处理空数据帧,r,loops,r-xlsx,R,Loops,R Xlsx,在循环中使用write.xlsx时,如何处理空数据帧 下面是循环的样子,其中source(“./Scripts/Analysis\u details.R”)引用了创建数据帧的R文件 library(xlsx) for (A in unique(df_base$A)) { df<- df_base[df_base$A==A,] source("./Scripts/Analysis_details.R") output_fi
library(xlsx)
for (A in unique(df_base$A)) {
df<- df_base[df_base$A==A,]
source("./Scripts/Analysis_details.R")
output_file = paste("./Output/report_", A, '_', Sys.Date(), ".xlsx", sep='')
write.xlsx(df1, file=output_file, sheetName="df1", append=TRUE, row.names=FALSE, showNA = FALSE)
write.xlsx(df2, file=output_file, sheetName="df2", append=TRUE, row.names=FALSE, showNA = FALSE)
write.xlsx(df3, file=output_file, sheetName="df3", append=TRUE, row.names=FALSE, showNA = FALSE)
write.xlsx(df4, file=output_file, sheetName="df4", append=TRUE, row.names=FALSE, showNA = FALSE)}
我可以通过在脚本中添加一个修改的
write.xlsx()
函数来解决这个问题。如果数据框中没有行,则跳过.write_block()
,并仅使用列名保存文件。请注意,您还必须将原始的.write_block()
函数复制到脚本中
write.xlsx.custom <- function(x, file, sheetName="Sheet1",
col.names=TRUE, row.names=TRUE, append=FALSE, showNA=TRUE)
{
if (!is.data.frame(x))
x <- data.frame(x) # just because the error message is too ugly
iOffset <- jOffset <- 0
if (col.names)
iOffset <- 1
if (row.names)
jOffset <- 1
if (append && file.exists(file)){
wb <- loadWorkbook(file)
} else {
ext <- gsub(".*\\.(.*)$", "\\1", basename(file))
wb <- createWorkbook(type=ext)
}
sheet <- createSheet(wb, sheetName)
noRows <- nrow(x) + iOffset
noCols <- ncol(x) + jOffset
if (col.names){
rows <- createRow(sheet, 1) # create top row
cells <- createCell(rows, colIndex=1:noCols) # create cells
mapply(setCellValue, cells[1,(1+jOffset):noCols], colnames(x))
}
if (row.names) # add rownames to data x
x <- cbind(rownames=rownames(x), x)
if(nrow(x) > 0) {
colIndex <- seq_len(ncol(x))
rowIndex <- seq_len(nrow(x)) + iOffset
.write_block(wb, sheet, x, rowIndex, colIndex, showNA)
}
saveWorkbook(wb, file)
invisible()
}
write.xlsx.custom我可以通过在脚本中添加一个修改后的write.xlsx()
函数来解决这个问题。如果数据框中没有行,则跳过.write_block()
,并仅使用列名保存文件。请注意,您还必须将原始的.write_block()
函数复制到脚本中
write.xlsx.custom <- function(x, file, sheetName="Sheet1",
col.names=TRUE, row.names=TRUE, append=FALSE, showNA=TRUE)
{
if (!is.data.frame(x))
x <- data.frame(x) # just because the error message is too ugly
iOffset <- jOffset <- 0
if (col.names)
iOffset <- 1
if (row.names)
jOffset <- 1
if (append && file.exists(file)){
wb <- loadWorkbook(file)
} else {
ext <- gsub(".*\\.(.*)$", "\\1", basename(file))
wb <- createWorkbook(type=ext)
}
sheet <- createSheet(wb, sheetName)
noRows <- nrow(x) + iOffset
noCols <- ncol(x) + jOffset
if (col.names){
rows <- createRow(sheet, 1) # create top row
cells <- createCell(rows, colIndex=1:noCols) # create cells
mapply(setCellValue, cells[1,(1+jOffset):noCols], colnames(x))
}
if (row.names) # add rownames to data x
x <- cbind(rownames=rownames(x), x)
if(nrow(x) > 0) {
colIndex <- seq_len(ncol(x))
rowIndex <- seq_len(nrow(x)) + iOffset
.write_block(wb, sheet, x, rowIndex, colIndex, showNA)
}
saveWorkbook(wb, file)
invisible()
}
write.xlsx.custom