2016-05-19 6 views
0

Ich schreibe derzeit mehrere Datenrahmen auf 1 Blatt mit , jeweils mit einer schönen offenen Spalte zwischen ihnen. Ich möchte die Datenframes auf dieses einzelne Blatt schreiben, so wie ich sie alle auf einem Blatt zur Analyse haben möchte und nicht 10 Blätter durchlaufen muss, um dies zu tun.Bessere Möglichkeit zum Schreiben einer Spalte starten Update-Funktion beim Schreiben in xlsx

Mein Spielzeug-Datensatz sieht wie folgt aus:

> 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 

Jetzt erstelle ich meine Arbeitsmappe und Arbeitsblatt und erstellen 3 verschiedene data.frames, die zu meiner xlsx Datei geschrieben werden.

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

Ich bin jetzt bereit, diese meine Datei zu dem Schreiben beginnen:

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") 

Wie Sie sehen können, nach jeder schreiben, ich habe die Startspalte aktualisieren dim() der Daten verwenden und 1 hinzufügen zu Lassen Sie eine leere Spalte zwischen data.frames.

ISNT es einen einfacheren Weg, um eine globale Funktion zu schaffen, die die Spaltenzählervariable für mich nur immer die zuletzt geschriebenen data.frame als Eingabe, zum Beispiel auf einfache Weise aktualisieren könnte:

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

update_col(df1) 

Antwort

1

Etwas ungetestet und Verwendung, wie Sie globalEnv Variablen vorschlagen:

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) 
} 

Jetzt etwas besser: eine Liste Ihrer Dataset erstellen und entsprechende Funktion erstellen, die auf der Liste mit einer Schleife basiert, Zähler in Schleife incremeting - dies verhindern globale Verwendung Env (exerice)

Oder noch besser, Liste des data.frame hat, und verwendet do.call("cbind",dataframe_list) (vorausgesetzt sie alle die gleiche Anzahl von Zeilen haben ...)

+0

Danke, das ist genau das, was ich wollte, wie ich speichere Meine Datenframes zu einem Listenobjekt, auf das ich diese Funktion nun anwenden kann –

Verwandte Themen