2016-03-23 6 views
1

Wirklich Schwierigkeiten mit dem Einfügen von dplyr Funktionen in meine Funktionen. Ich verstehe die function_ Suffix für die Standard-Evaluierungsversionen, aber immer noch Probleme, und scheinbar alle Kombinationen von evalpaste und lazy versucht.muate_each_ Nicht-Standard-Bewertung

Der Versuch, mehrere Spalten durch den Median des Steuerelements für eine Gruppe zu teilen. Beispieldaten enthalten eine zusätzliche Spalte in Iris namens "Control", so dass jede Spezies 40 "normal" und 10 "Kontrolle" hat.

data(iris) 
control <- rep(c(rep("normal", 40), rep("control", 10)), 3) 
iris$Control <- control 

Normale dplyr funktioniert:

out_df <- iris %>% 
    group_by(Species) %>% 
    mutate_each(funs(./median(.[Control == "control"])), 1:4) 

Der Versuch, diese in eine Funktion einpacken:

norm_iris <- function(df, control_col, control_val, species, num_cols = 1:4){ 

out <- df %>% 
    group_by_(species) %>% 
    mutate_each_(funs(./median(.[control_col == control])), num_cols) 
    return(out) 
} 

norm_iris(iris, control_col = "Control", control_val = "control", species = "Species") 

ich den Fehler:

Error in UseMethod("as.lazy_dots") : 
no applicable method for 'as.lazy_dots' applied to an object of class "c('integer', 'numeric')" 

Mit funs_ statt von funs Ich bekomme Error:...: need numeric data

Antwort

1

Wenn Sie noch nicht haben, könnte es Ihnen helfen, die Vignette auf Standardauswertung here zu lesen, obwohl es sich anhört, als ob sich einiges davon bald ändern könnte.

Ihre Funktion fehlt die Verwendung von interp von Paket lazyeval in der mutate_each_ Linie. Da Sie versuchen, einen Variablennamen (die Variable Control) in funs zu verwenden, benötigen Sie funs_ in dieser Situation zusammen mit interp. Beachten Sie, dass dies eine Situation ist, in der Sie mutate_each_ überhaupt nicht benötigen. Sie würden es benötigen, wenn Sie bei der Auswahl der Spalten, die Sie mutieren möchten, anstelle von Spaltennummern Spaltennamen verwenden möchten.

Hier ist, was die Zeile wie in Ihrer Funktion aussehen würde statt dessen, was Sie haben:

mutate_each(funs_(interp(~./median(.[x == control_val]), x = as.name(control_col))), 
         num_cols)