2017-01-21 2 views
0

Ich versuche, die summarize-Funktion in dplyr zu verwenden, um zusammenfassende Statistiken mithilfe einer Zwei-Argument-Funktion zu berechnen, die einen Tabellen- und Feldnamen aus einer verbundenen Datenbank übergibt. Leider, sobald ich die summarize-Funktion mit einer anderen Funktion umbringe, sind die Ergebnisse nicht korrekt. Die Endtabelle ist ein Datenrahmen, der nicht durch jede Zeile iteriert. Ich werde die Eingabe/Ausgabe unten zeigen:Übergabe von Argumenten an dplyr summarize Funktion

Zusammenfassung Statistikfunktion Bibliothek (dplyr)

data<-iris 
data<- group_by(.data = data,Species) 

SummaryStatistics <- function(table, field){ 
table %>% 
summarise(count = n(), 
      min = min(table[[field]], na.rm = T), 
      mean = mean(table[[field]], na.rm = T, trim=0.05), 
      median = median(table[[field]], na.rm = T)) 
} 

SummaryStatistics(data, "Sepal.Length") 

Ausgabetabelle-falsch, es ist nur die gleiche Berechnung zu wiederholen

 Species count min  mean median 
1  setosa 50 4.3 5.820588 5.8 
2 versicolor 50 4.3 5.820588 5.8 
3 virginica 50 4.3 5.820588 5.8 

Korrekte Tabelle/gewünschtes Ergebnis - - So sollte der Tisch aussehen. Wenn ich die summarize-Funktion über die Wrapper-Funktion ausführe, ist dies, was es produziert.

 Species count min  mean median 
1  setosa 50 4.3 5.002174 5.0 
2 versicolor 50 4.9 5.934783 5.9 
3 virginica 50 4.9 6.593478 6.5 

Ich hoffe, dass dies leicht zu verstehen ist. Ich kann einfach nicht verstehen, warum die Statistik für die Zusammenfassung außerhalb der Wrapper-Funktion perfekt funktioniert, aber sobald ich ihr Argumente übergebe, berechnet sie für jede Zeile dasselbe. Jede Hilfe würde sehr geschätzt werden.

Danke, Kev

+1

Schwer zu diagnostizieren, ohne zu wissen, wie Sie die Wrapper-Funktion verwenden. Aber bei einer Vermutung weiß 'summarize', wenn es einmal innerhalb der Wrapper-Funktion ist, möglicherweise nicht über die Gruppierungsfaktoren, die in der Berechnung verwendet werden. So würde es die gleiche Zusammenfassung für alle Zeilen zurückgeben. – jdobres

+0

@jdobres Ich werde die Wrapper-Funktion hinzufügen. Das tut mir leid. – AlphaKevy

+1

Sie müssen die Standardauswertung verwenden. Lesen Sie die 'dplyr'-Vignette für eine bessere Idee. –

Antwort

4

Sie müssen Standardauswertung verwenden dplyr Funktionen neben lazyeval programmatisch zu verwenden. Die dplyrNSE vignette deckt es ziemlich gut ab.

library(dplyr) 
library(lazyeval) 

data <- group_by(iris, Species) 

SummaryStatistics <- function(table, field){ 
    table %>% 
    summarise_(count = ~n(), 
       min = interp(~min(var, na.rm = T), var = as.name(field)), 
       mean = interp(~mean(var, na.rm = T, trim=0.05), var = as.name(field)), 
       median = interp(~median(var, na.rm = T), var = as.name(field))) 
} 

SummaryStatistics(data, "Sepal.Length") 

# A tibble: 3 × 5 
    Species count min  mean median 
     <fctr> <int> <dbl> <dbl> <dbl> 
1  setosa 50 4.3 5.002174 5.0 
2 versicolor 50 4.9 5.934783 5.9 
3 virginica 50 4.9 6.593478 6.5 
+0

Vielen Dank für die Beantwortung meiner Frage und, noch wichtiger, danke für die Verknüpfung mit dem Dokument zur programmatischen Verwendung von dplyr. Ich war auf der Suche nach so etwas, konnte es aber nicht aufspüren. Ich schätze die Gründlichkeit Ihrer Antwort sehr. Danke nochmal, Mann. – AlphaKevy

+0

Der NSE-Vignetten-Link ist tot, es sieht so aus, als wäre er durch die [Programmierung mit dplyr-Vignette] (https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html) ersetzt worden. – ropeladder

Verwandte Themen