2017-08-22 2 views
5

Dies ist eine Folge von how to combine ggplot and dplyr into a function?.Wie erstellt man Faktorvariablen aus Quasures in Funktionen mit ggplot und dplyr?

Das Problem ist, wie man eine Funktion schreibt, die dplyr, ggplot verwendet und möglicherweise Faktorvariablen von quosures angibt? Hier

ist ein Beispiel

dataframe <- data_frame(id = c(1,2,3,4,5,6), 
         group = c(1,1,0,0,3,4), 
         value = c(200,400,120,300,100,100)) 

# A tibble: 6 x 3 
    id group value 
    <dbl> <dbl> <dbl> 
1  1  1 200 
2  2  1 400 
3  3  0 120 
4  4  0 300 
5  5  3 100 
6  6  4 100 

Wie Sie sehen können, die Gruppenvariable group numerisch ist hier, so

get_charts1 <- function(data, mygroup, myoutput){ 

    quo_var <- enquo(mygroup) 
    quo_output <- enquo(myoutput) 

    df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(!!quo_output, na.rm = TRUE), 
       count = n()) %>% 
    ungroup() 

    ggplot(df_agg, aes_q(x = quote(count), y = quote(mean), color = quo_var, group = quo_var)) + 
    geom_point() + 
    geom_line() 
} 

get_charts1(dataframe, 
      mygroup = group, 
      myoutput = value) 

ausgeben wird ein Diagramm mit einer kontinuierlichen Skala für die Gruppenvariable, die ist nicht erwünscht.

enter image description here

Im Idealfall würde Ich mag Faktorvariablen on-the-fly definieren. Das heißt, etwas in der Funktion zu haben:

ggplot(df_agg, aes_q(x = quote(count), 
         y = quote(mean), 
         color = factor(quo_var), 
         group = factor(quo_var))) + 
    geom_point() + 
    geom_line() 

was natürlich nicht funktioniert.

Die Frage ist: Was kann hier getan werden?

Danke !!

Antwort

5

Hier ist eine Möglichkeit, andere rlang Funktionen zu verwenden.

get_charts1 <- function(data, mygroup){ 

    quo_var <- enquo(mygroup) 

    df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE), 
       count = n()) %>% 
    ungroup() 

    cc <- rlang::expr(factor(!!(rlang::get_expr(quo_var)))) 
    # or just cc <- expr(factor(!!get_expr(quo_var))) if you include library(rlang) 

    ggplot(df_agg, aes_q(x = quote(count), y = quote(mean), color = cc)) + 
    geom_point() + 
    geom_line() 
} 

Wir bauen den Ausdruck factor(group) mit der expr() Funktion. Wir verwenden get_expr(), um den Symbolnamen "group" aus der Anfrage quo_var zu extrahieren. Sobald wir den Ausdruck erstellt haben, können wir ihn an aes_q weiterleiten.

Hoffentlich wird ggplot bald aufgeräumt-eval-freundlich und das wird nicht mehr notwendig sein.

+0

sehr süß! Vielen Dank! Was irgendwie nett ist, ist, dass das Aufrufen dieser Funktion mit einfachen Operationen auf dem 'value' var tatsächlich funktioniert: sagen' get_charts1 (Datenrahmen, mygroup = Gruppe, myoutput = log (Wert)) ' –

Verwandte Themen