2017-10-11 1 views
0

Was ist der beste Weg, in eine Datei einen Text zu schreiben, gefolgt von einem Datenrahmen? Der Text wird erstellt, indem Variablen in Zeichenfolgen eingefügt werden.r Schreiben Sie Text und Daten in Datei

Beispiel gewünschte Ausgabe:

Here is some text. 
This line has a variable: Hello World 
Data frame below the line 
================= 
ID,val1,val2 
1,2,3 
2,4,6 
3,6,9 
4,8,12 
5,10,15 
6,12,18 
7,14,21 
8,16,24 
9,18,27 
10,20,30 

ich einen String mit dem ursprünglichen Text erstellen:

myvar <- "Hello World" 
out_string <- paste0("Here is some text.\n", 
        "This line has a variable: ", myvar, "\n", 
        "Data frame below the line\n", 
        "=================\n") 
cat(out_string) 

Und ich einen Datenrahmen schreiben in Datei:

library(data.table) 

mydf <- data.frame(ID = 1:10, val1 = 1:10*2, val2 = 1:10*3) 

fwrite(x = mydf, 
    file = "path/file.txt", 
    sep = ",", 
    col.names=T) 

Aber ich bin mir nicht sicher, wie ich diese beiden am besten kombiniere.

Ich würde denken, nur den Datenrahmen auf das Ende der out_string einfügen dann schreiben, dass in Datei wäre am besten, aber meine Versuche sind fehlgeschlagen, z.

cat(paste0(out_string, mydf, collapse='')) 
# Here is some text. 
# This line has a variable: Hello World 
# Data frame below the line 
# ================= 
# 1:10Here is some text. 
# This line has a variable: Hello World 
# Data frame below the line 
# ================= 
# c(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)Here is some text. 
# This line has a variable: Hello World 
# Data frame below the line 
# ================= 
# c(3, 6, 9, 12, 15, 18, 21, 24, 27, 30) 

Antwort

1

Wahrscheinlich gibt es ein paar Möglichkeiten, dies zu tun. Ein einfaches man

cat(out_string, file = '/tmp/test.txt') 
cat(paste0(colnames(mydf), collapse = ','), file = '/tmp/test.txt', append = T, sep = '\n') 
cat(apply(mydf,1,paste0, collapse=','), file = '/tmp/test.txt', append = T, sep = '\n') 

und natürlich mit fwrite:

cat(out_string, file = '/tmp/test.txt') 
fwrite(x = mydf, 
    file = "/tmp/test.txt", 
    sep = ",", 
    col.names=T, 
    append=T) 
+0

Beide Methoden funktionierten wie gewünscht. Vielen Dank! – conor

1

Eine Möglichkeit ist, eine Verbindung herzustellen, die Sie mit beiden zu writeLines und write.csv schreiben:

myvar <- "Hello World" 
out_string <- paste0("Here is some text.\n", 
        "This line has a variable: ", myvar, "\n", 
        "Data frame below the line\n", 
        "=================\n") 
mydf <- data.frame(ID = 1:10, val1 = 1:10*2, val2 = 1:10*3) 


my_file <- file('file.csv', 'w') 

writeLines(out_string, my_file, sep = '') 
write.csv(mydf, my_file, quote = FALSE, row.names = FALSE) 

close(my_file) 

readLines('file.csv') 
#> [1] "Here is some text."     
#> [2] "This line has a variable: Hello World" 
#> [3] "Data frame below the line"    
#> [4] "================="      
#> [5] "ID,val1,val2"       
#> [6] "1,2,3"         
#> [7] "2,4,6"         
#> [8] "3,6,9"         
#> [9] "4,8,12"        
#> [10] "5,10,15"        
#> [11] "6,12,18"        
#> [12] "7,14,21"        
#> [13] "8,16,24"        
#> [14] "9,18,27"        
#> [15] "10,20,30" 
+0

Diese Methode fügt eine Zeile zwischen den 'out_string'- und den'mydf'-Schreibvorgängen hinzu und gibt die Spaltennamen in Anführungszeichen um sie aus. – conor

+0

@conor Aktualisiert, um die Trennzeichen zu entfernen, die von 'writeLines' eingefügt wurden ('out_string' hat sie bereits) und fügt den Parameter' quote = FALSE' zu 'write.csv' hinzu. Ich neige dazu, 'readr :: write_csv' für bessere Standardwerte zu verwenden, aber es ist nett, alles in Base R zu behalten. – alistaire

+0

Danke @alistaire, es passt, was jetzt angefordert wurde. – conor

1

Noch ein anderer Weg: sink() öffnet eine Verbindung zu einer Datei.

sink("<your_new_file_name>") 
out_string 
df 
sink() 
+0

Dies sollte 'cat (out_string)' haben, um richtig zu rendern. Außerdem funktioniert es fast wie gewünscht, aber die Ausgabe von 'mydf' hat Spalten, die auf Leerzeichen ausgerichtet sind, anstatt auf csv. Immer noch schön, wenn man diese Formatierung will. – conor

+0

Sorry, ich habe nicht auf die Details des Formats Ihrer Antwort geachtet. Ich dachte, du fragst, wie man einfach eine Datei schreibt, die die beiden Ausgänge kombiniert. – shea

+0

Keine Sorge. Ich war mir nicht bewusst, "sinken" und ich kann sehen, dass es sehr nützlich ist, also bin ich dankbar für Ihre Antwort. – conor

Verwandte Themen