2013-08-29 7 views
7

Ich bin relativ neu zu R, und versuchen, ddply & aus dem Plyr-Paket zusammenzufassen. This post fast, aber nicht ganz, beantwortet meine Frage. Ich könnte eine zusätzliche Erklärung/Erklärung verwenden.Verwenden Sie ddply innerhalb einer Funktion und enthalten Variable von Interesse als Argument

Mein Problem:

Ich möchte eine einfache Funktion erstellen deskriptiven Statistik zusammenzufassen, durch Gruppe, für eine bestimmte Variable. Im Gegensatz zum verknüpften Beitrag möchte ich die Variable von Interesse als Argument für die Funktion verwenden. Wie bereits auf dieser Seite diskutiert worden ist, funktioniert dies:

require(plyr) 

ddply(mtcars, ~ cyl, summarise, 
    mean = mean(hp), 
    sd = sd(hp), 
    min = min(hp), 
    max = max(hp) 
) 

Aber dies nicht:

descriptives_by_group <- function(dataset, group, x) 
{ 
    ddply(dataset, ~ group, summarise, 
    mean = mean(x), 
    sd = sd(x), 
    min = min(x), 
    max = max(x) 
) 
} 

descriptives_by_group(mtcars, cyl, hp) 

Wegen des Umfangs der Daten, mit denen ich arbeite, würde Ich mag Lage sein, um eine Funktion zu haben, die es mir ermöglicht, die für mich interessante Variable sowie die Datenmenge und Gruppierungsvariable zu spezifizieren.

Ich habe versucht, die verschiedenen gefundenen Lösungen here zu bearbeiten, um mein Problem zu adressieren, aber ich verstehe den Code nicht gut genug, um es erfolgreich zu machen.

Das ursprüngliche Plakat den folgenden Beispiel-Datensatz verwendet wird:

a = c(1,2,3,4) 
b = c(0,0,1,1) 
c = c(5,6,7,8) 
df = data.frame(a,b,c) 
sv = c("b") 

mit der gewünschten Ausgabe:

b Ave 
1 0 1.5 
2 1 3.5 

und die Lösung von Hadley gebilligt wurden:

myFunction <- function(x, y){ 
NewColName <- "a" 
z <- ddply(x, y, .fun = function(xx,col){ 
         c(Ave = mean(xx[,col],na.rm=TRUE))}, 
      NewColName) 
return(z) 
} 

Wo myFunction(df, sv) Renditen die gewünschte Ausgabe.

Ich habe versucht, den Code Stück für Stück aufzuschlüsseln, um zu sehen, ob ich durch besseres Verständnis der zugrundeliegenden Mechanik den Code so modifizieren könnte, dass er ein Argument für die Funktion enthält, die an was übergeben wird Beispiel: "NewColName" (die Variable, zu der Sie Informationen erhalten möchten). Aber ich habe keinen Erfolg. Meine Schwierigkeit ist, dass ich nicht verstehe, was mit (xx[,col]) passiert. Ich weiß, dass der Mittelwert (xx [, col]) den Mittelwert der Spalte mit dem Index col für den Datenrahmen xx annehmen sollte. Aber ich verstehe nicht, woher die anonyme Funktion diese Werte liest.

Könnte mir bitte jemand helfen, dies zu analysieren? Ich habe Stunden mit einer trivialen Aufgabe verschwendet, die ich leicht mit sehr repetitivem Code und/oder mit Subsetting erreichen konnte, aber ich habe aufgelegt, mein Skript einfacher und eleganter zu machen und das "Warum" dieses Problems zu verstehen seine Lösung (en).

PS Ich habe mir die describeBy-Funktion aus dem Paket psych angesehen, aber soweit ich das beurteilen kann, lässt sie nicht die Variablen zu, für die Werte zurückgegeben werden sollen, und löst daher nicht mein Problem .

+0

Ich bin nicht sicher, ich unde rstand. 'ddply' akzeptiert einen Zeichenvektor von Gruppierungsvariablen. Wie in, 'ddply (Daten, c ('var1', 'var2'), ...)'. – joran

+0

Schauen Sie sich auch 'colwise' an – hadley

+0

Das Problem war, dass das dritte Argument in 'summarise' übergeben wurde. –

Antwort

7

Ich habe gerade ein paar Dinge in der Beispielfunktion verschoben und gezeigt, wie man mehr als eine Spalte wieder raus bekommt. Macht das was du willst?

myFunction2 <- function(x, y, col){ 
z <- ddply(x, y, .fun = function(xx){ 
         c(mean = mean(xx[,col],na.rm=TRUE), 
         max = max(xx[,col],na.rm=TRUE)) }) 
return(z) 
} 

myFunction2(mtcars, "cyl", "hp") 
5

(Mehr eines Kommentars als eine Antwort. Ich hatte das gleiche Schwierigkeitsgrad, wie Sie, wenn ddply(...,summarise, ...) in einer Funktion verwenden.) Dies ist eine Basislösung, die die Art und Weise habe ich erwartet:

descriptives_by_group <- function(dataset, group, x) 
    {aggregate(dataset[[x]], dataset[group], function(x) 
     c( mean = mean(x), 
      sd = sd(x), 
      min = min(x), 
      max = max(x) 
     )) 
    } 

descriptives_by_group(mtcars, 'cyl', 'hp') 
3

Nur as.quoted Funktion verwenden. Beispiel unten

simple_ddply <- function(dataset_name, variable_name){ 
    data <- ddply(dataset_name,as.quoted(variable_name), *remaining input)** 
0

Mit der Einführung von quosures in der Entwick-Version von dplyr (bald 0.6.0 freigegeben werden), wird dies ein wenig einfache

library(dplyr) 
descriptives_by_groupN <- function(dataset, group, x) { 

    group <- enquo(group) 
    x <- enquo(x) 

    dataset %>% 
     group_by(!!group) %>% 
     summarise(Mean = mean(!!x), 
       SD = sd(!!x), 
       Min = min(!!x), 
       Max = max(!!x)) 
} 

descriptives_by_groupN(mtcars, cyl, hp) 
# A tibble: 3 × 5 
# cyl  Mean  SD Min Max 
# <dbl>  <dbl> <dbl> <dbl> <dbl> 
#1  4 82.63636 20.93453 52 113 
#2  6 122.28571 24.26049 105 175 
#3  8 209.21429 50.97689 150 335 

Hier werden die Eingabeargumente umgewandelt quosures mit enquo, und innerhalb der group_by/summarise, setzen Sie die Quures (!! oder UQ), um es bewertet zu bekommen

Verwandte Themen