2015-02-08 10 views
6

Mit dplyr möchte ich [sic] durch eine Variable zusammenfassen, die ich variieren kann (z. B. in einer Schleife oder Anwendung Stil-Befehl).Programmgesteuertes Aufrufen von group_by() auf einer variierenden Variablen

Typing die Namen in direkt funktioniert:

library(dplyr) 
ChickWeight %>% group_by(Chick, Diet) %>% summarise(mw = mean(weight)) 

Aber group_by kein Zeichen Vektor nehmen geschrieben wurde, so in den Ergebnissen vorbei ist härter.

v <- "Diet" 
ChickWeight %>% group_by(c("Chick", v)) %>% summarise(mw = mean(weight)) 
## Error 

Ich poste eine Lösung, aber neugierig zu sehen, wie andere dies gelöst haben.

+1

:-) 'summieren [sic]' +1 –

+4

Tun Sie einfach 'group_by_ (c (" Chick ", v))' anstelle von 'group_by (c (" Chick ", v))' .... –

+0

@Ari Wenn Sie US-Rechtschreibung verwenden, warum verwenden Sie 'summarise' im Code? –

Antwort

11

Die Unterfunktionen von dplyr für die nützlich sein könnten:

ChickWeight %>% group_by_("Chick", v) %>% summarise(mw = mean(weight)) 

Vom new features in dplyr 0.3:

Sie können jetzt mit dplyr programmieren - jede Funktion, die nicht standardmäßige Auswertung (NSE) verwendet, hat auch eine Standardauswertung (SE) twin, die in _ endet. Zum Beispiel wird die SE-Version von filter() Filter _() genannt. Die SE-Version jeder Funktion hat ähnliche Argumente, aber sie müssen explizit "zitiert" werden.

0

Hier ist eine Lösung und wie ich es erreicht habe.

Was erwartet group_by?

> group_by 
function (x, ..., add = FALSE) 
{ 
    new_groups <- named_dots(...) 

in den Kaninchenbau:

> dplyr:::named_dots 
function (...) 
{ 
    auto_name(dots(...)) 
} 
<environment: namespace:dplyr> 
> dplyr:::auto_name 
function (x) 
{ 
    names(x) <- auto_names(x) 
    x 
} 
<environment: namespace:dplyr> 
> dplyr:::auto_names 
function (x) 
{ 
    nms <- names2(x) 
    missing <- nms == "" 
    if (all(!missing)) 
     return(nms) 
    deparse2 <- function(x) paste(deparse(x, 500L), collapse = "") 
    defaults <- vapply(x[missing], deparse2, character(1), USE.NAMES = FALSE) 
    nms[missing] <- defaults 
    nms 
} 
<environment: namespace:dplyr> 
> dplyr:::names2 
function (x) 
{ 
    names(x) %||% rep("", length(x)) 
} 

diese Informationen benutzen, wie etwa Crafting, eine Lösung zu gehen?

# Naive solution fails: 
ChickWeight %>% do.call(group_by, list(Chick, Diet)) %>% summarise(mw = mean(weight)) 

# Slightly cleverer: 
do.call(group_by, list(x = ChickWeight, Chick, Diet, add = FALSE)) %>% summarise(mw = mean(weight)) 
## But still fails with, 
## Error in do.call(group_by, list(x = ChickWeight, Chick, Diet, add = FALSE)) : object 'Chick' not found 

Die Lösung liegt in unter Angabe der Argumente so ihre Bewertung verzögert wird, bis sie in der Umwelt sind, die die x Tabl beinhalten:

do.call(group_by, list(x = ChickWeight, quote(Chick), quote(Diet), add = FALSE)) %>% summarise(mw = mean(weight)) 
## Bingo! 
v <- "Diet" 
do.call(group_by, list(x = ChickWeight, quote(Chick), substitute(a, list(a = v)), add = FALSE)) %>% summarise(mw = mean(weight)) 
Verwandte Themen