2016-05-19 23 views
0

我目前使用openxlsx将多个数据框写入1个工作表,每个工作表之间有一个很好的开放列。我想将这些数据框写入到这张表中,因为我希望将它们全部放在一张纸上进行分析,而不必通过10张纸进行分析。写入xlsx时写入列开始更新函数的更好方法

我的玩具数据集如下所示:

> random_dat 
    Letters Count Letters.1 Count.1 Letters.2 Count.2 Final 
1  A  1  A1 0.21477659   Z  10 Z10 
2  A  2  A2 0.92217670   X  12 X12 
3  A  3  A3 0.49196523   T  14 T14 
4  B  1  B1 0.08086314   Y  16 Y16 
5  B  2  B2 0.80177983   Z  18 Z18 
6  A  4  A4 0.35970442   X  20 X20 
7  B  3  B3 0.21102868   T  22 T22 
8  C  1  C1 0.75816713   Y  24 Y24 
9  C  2  C2 0.59261425   Z  26 Z26 
10  D  1  D1 0.73484393   X  28 X28 
11  A  5  A5 0.32830008   T  30 T30 
12  C  3  C3 0.21672748   Y  32 Y32 

现在我创造我簿和工作表,并创建3种不同的data.frames将被写入到我xlsx文件。

library(openxlsx) 
wb <- createWorkbook() 
addWorksheet(wb,sheetName = "Output") 
df1 <- random_dat[,1:2] 
df2 <- random_dat[,2:3] 
df3 <- random_dat[,3:7] 

我现在已经准备好开始写这些给我的文件:

writeData(wb, sheet = "Output", df1, startCol = 1, startRow = 1, xy = NULL, 
      colNames = TRUE, rowNames = FALSE, headerStyle = NULL, withFilter = FALSE, 
      keepNA = FALSE) 
start_col <- 1 
start_col <- start_col+dim(df1)[2]+1 

writeData(wb, sheet = "Output", df2, startCol = start_col, startRow = 1, xy = NULL, 
      colNames = TRUE, rowNames = FALSE, headerStyle = NULL, withFilter = FALSE, 
      keepNA = FALSE) 

start_col <- start_col+dim(df1)[2]+1 

writeData(wb, sheet = "Output", df1, startCol = start_col, startRow = 1, xy = NULL, 
      colNames = TRUE, rowNames = FALSE, headerStyle = NULL, withFilter = FALSE, 
      keepNA = FALSE) 

start_col <- start_col+dim(df1)[2]+1 

saveWorkbook(wb, "output.xlsx") 

正如你所看到的,之后每次写,我用数据dim()更新开始列,添加1作为请在data.frames之间留出空栏。

心不是有更简单的方法来创建一个全球性的功能,可以只得到最后的书面data.frame作为输入,例如更新列计数器变量我在一个简单的方法:

update_col<-function(df,envir = .GlobalEnv) 
{ 
    if(!("start_col" %in% ls())) start_col<<-1 
    start_col<<-start_col + dim(df)[2] 
} 

update_col(df1) 

回答

1

东西未经测试,使用你的建议globalEnv变量:

mywriteData <- function(wb, sheet="output",df, first=TRUE,...){ 
    if first { 
    previous_Ncol <<- 0 
    start_col <<- 1 
    } 
    start_col <<- start_col+previous_Ncol 
    writeData(wb, sheet = "Output", df, startCol = start_col, ...) 
previous_Ncol <<- previous_Ncol + ncol(df) 
} 

现在更好的东西:创建数据集的列表,并创建一个基于同一个循环就行了同等功能,在循环incremeting计数器 - 这避免使用全球ENV(exerice)

甚至更​​好,有data.frame的列表,并使用do.call("cbind",dataframe_list)(假定它们都具有相同的行数...的)

+0

谢谢,这正是我想要的,因为我现在的储蓄我的数据帧到一个列表对象,我现在可以将这个功能应用于其中 –