2016-06-14 2 views
2

Ich arbeite für eine Forschungsabteilung, die es leid ist, SAS eine halbe Million pro Jahr zu bezahlen. Als einziger R/SAS-Dual-User in der Abteilung wurde ich damit beauftragt, den Übergang zu leiten. Die meisten unserer Analysten waren gute Sportarten und liefen reibungsloser als gedacht.Ich muss R-Code/Konsole ähnlich einem SAS-Protokoll zu dokumentieren

Aber wir brauchen eine Möglichkeit, unsere Programme zu Dokumentationszwecken zu protokollieren, ähnlich wie bei SAS. Die Protokolle müssen einfache Metriken enthalten, Anzahl der Beobachtungen beim Zusammenführen von Daten, Warnungen/Fehler, wahrscheinlich auch die gesamte Ausgabe.

Einige dieser Sachen werden in der Konsole ausgegeben und ich kann sinken(), um das Ding zu speichern, aber es gibt eine Menge, die nicht ausgegeben wird. Wir können den Programmen zusätzlichen Code hinzufügen, um diese Dinge zu dokumentieren - nrows() vor/nach der Zusammenführung, zum Beispiel -, aber ich möchte es meinen Analysten erleichtern.

Kann mir jemand in eine Richtung zeigen, um ein detaillierteres Protokoll von R einfacher auszugeben? Ein Paket oder eine Funktion, von der ich noch nie gehört habe?

Danke.

+0

Können Sie nach ein Beispiel für eine solche Protokolldatei? – Thierry

+0

Dies ist ein Bereich, in dem R nicht so toll ist. Wenn Sie eine interaktive Sitzung wie SAS, die wirklich hart ist, protokollieren möchten. Wenn Sie möchten, dass Sie R im Batch ausführen, können Sie OK machen. – Carl

Antwort

1

Sie könnten in Betracht ziehen, Skripts in rmarkdown-Dateien zu konvertieren. Das Kompilieren der Rmarkdown-Dateien kann Protokolldateien ergeben, die viel potenter sind als reine Textdateien.

glimpse() für das Paket dplyr() ist nützlich, um einen schnellen Überblick über den Inhalt eines Datenrahmens zu erhalten. str() gibt eine ähnliche Ausgabe für Datenrahmen und funktioniert auch in anderen Klassen.

library(dplyr) 
glimpse(mtcars) 

Observations: 32 
Variables: 11 
$ mpg (dbl) 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 1... 
$ cyl (dbl) 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8... 
$ disp (dbl) 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 167.6, 167... 
$ hp (dbl) 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 2... 
$ drat (dbl) 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3... 
$ wt (dbl) 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3.440, 3.4... 
$ qsec (dbl) 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 18.30, 18.... 
$ vs (dbl) 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0... 
$ am (dbl) 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0... 
$ gear (dbl) 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3... 
$ carb (dbl) 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2... 
+0

Ich denke, "Zusammenfassung" hat das bereits abgedeckt. Ich wäre gespannt, ob ich den anderen Teil des OP - "Anzahl der Beobachtungen beim Zusammenführen von Daten" - in Protokolle aufnehmen könnte. – Frank

+0

Zusammenfassung() gibt nicht die Anzahl der Beobachtungen. every() und str() geben die Anzahl der Beobachtungen an. – Thierry

+0

Oh richtig, guter Punkt. Irgendwelche Gedanken zum anderen Teil der Frage? Es ist eine Weile her, seit ich SAS benutzt habe, aber ich denke, das OP bedeutet wie "100 übereinstimmende Datensätze; 10 Datensätze in A nicht übereinstimmend" (wie ich in Stata sehe). – Frank

1

Wenn Sie einen R-Skript in der Befehlszeile mit R CMD BATCH ausführen können Sie eine Rout Datei mit dem Code speichern, sowie alle die Ausgabe einschließlich Warnungen und Fehler, die im Wesentlichen der gleiche wie eine Datei Stata Protokolls, das Ihren Mitarbeitern geht es wahrscheinlich gut, wenn sie SAS mögen.

Sie könnten Wrapper-Funktion für Dinge, die Sie viel tun, und wollen bestimmte Dokumentation für d. H. Zusammenführungen, wie Sie sagten. So etwas wie:

sasMerge <- function(x, y, ...) { 
    print(sprintf("The first table has %s rows", nrow(x))) 
    print(sprintf("The second table has %s rows", nrow(y))) 

    out <- merge(x, y, ...) 

    print(sprintf("The merged table has %s rows", nrow(out))) 

    return(out) 
} 

Ein vollständiges reproduzierbares Beispiel mit einer Log-Datei ist hier:

rFile <- file("test.r") 
rCode <- ' 
sasMerge <- function(x, y, ...) { 
    print(sprintf("The first table has %s rows", nrow(x))) 
print(sprintf("The second table has %s rows", nrow(y))) 

out <- merge(x, y, ...) 

print(sprintf("The merged table has %s rows", nrow(out))) 

return(out) 
} 

authors <- data.frame(
    surname = I(c("Tukey", "Venables", "Tierney", "Ripley", "McNeil")), 
    nationality = c("US", "Australia", "US", "UK", "Australia"), 
    deceased = c("yes", rep("no", 4))) 
books <- data.frame(
    name = I(c("Tukey", "Venables", "Tierney", 
      "Ripley", "Ripley", "McNeil", "R Core")), 
    title = c("Exploratory Data Analysis", 
      "Modern Applied Statistics ...", 
      "LISP-STAT", 
      "Spatial Statistics", "Stochastic Simulation", 
      "Interactive Data Analysis", 
      "An Introduction to R"), 
    other.author = c(NA, "Ripley", NA, NA, NA, NA, 
        "Venables & Smith")) 

sasMerge(authors, books, by.x = "surname", by.y = "name") 
' 

writeLines(rCode,rFile) 
close(rFile) 

system("R CMD BATCH test.r") 

Wenn Sie dies ein Beispiel Mischlauf ausgeführt wird und die Protokolldatei gespeichert wird

Verwandte Themen