2017-07-05 2 views
2

Wie kann ich eine Funktion machen, die eine Spalte nimmt und diese in dplyr, tidyr und ggplot verwendet?Funktion mit dplyr, tidyr und ggplot

df <- data.frame(date_col = c(1,1,2,2,3,4,4,5,5), 
       col_a = c('a','b','a','b','a','a','b','a','b'), 
       val_col = runif(9)) 

Wie kann ich eine Funktion schreiben, einen Parameter param_col statt der fest codierten col_a

df %>% 
    group_by(date_col, col_a) %>% 
    summarise(val_col = sum(val_col)) %>% 
    complete(col_a, date_col) %>% 
    ggplot(aes(date_col, val_col, color = col_a)) + 
    geom_line() 

Die dplyr und ggplot Anrufe im Code arbeiten im Folgenden erläutert. Aber wie sollte der complete Aufruf geschrieben werden? Oder sollte complete_ verwendet werden?

Gibt es eine kanonische Methode, dies zu tun?

plot_nice_chart <- function(df, param_col) { 

    enq_param_col <- enquo(param_col) 
    str_param_col <- deparse(substitute(param_col)) 


    # aggregate data based on group_by_col, 
    # explicitly fill in NA's for missing to avoid interpolation 
    df %>% 
    group_by(!!enq_param_col, date_col) %>% 
    summarise(val_col = sum(val_col)) %>% 
    complete(<what-should-be-here?>, date_col) %>% 
    ggplot(aes_string("date_col", "val_col", color = str_param_col)) + 
     geom_line() 
} 
+0

Können Sie einige Beispieldaten angeben? – Jimbou

+0

Es sieht nicht so aus, als würden Sie Funktionsargumente an "complete" übergeben, also scheint es so zu sein, dass die Dinge so funktionieren sollten wie sie sind. Funktioniert die Funktion nicht? – aosmith

+0

Was sollte Ersetzt werden, um fehlende Ebenen in der Kombination von group_by_col und date_col zu vervollständigen – Rickard

Antwort

1

Die Entwicklungsversion von tidyr, tidyr_0.6.3.9000, verwendet jetzt tidyeval, wenn Sie also zu, dass aktualisieren möchten könnten Sie !! verwenden, wie Sie in group_by tat.

plot_nice_chart <- function(df, param_col) { 

    enq_param_col <- enquo(param_col) 
    str_param_col <- deparse(substitute(param_col)) 
    str_param_col 
    df %>% 
      group_by(!!enq_param_col, date_col) %>% 
      summarise(val_col = sum(val_col)) %>% 
      ungroup() %>% 
      complete(!!enq_param_col, date_col) %>% 
      ggplot(aes_string("date_col", "val_col", color = str_param_col)) + 
      geom_line() 
} 

Mit der aktuellen Version können Sie complete_ mit Variablen als Strings verwenden.

plot_nice_chart <- function(df, param_col) { 

    enq_param_col <- enquo(param_col) 
    str_param_col <- deparse(substitute(param_col)) 

    df %>% 
      group_by(!!enq_param_col, date_col) %>% 
      summarise(val_col = sum(val_col)) %>% 
      ungroup() %>% 
      complete_(c(str_param_col, "date_col")) %>% 
      ggplot(aes_string("date_col", "val_col", color = str_param_col)) + 
      geom_line() 
} 
+0

Danke. Wrapping String Argumente in einem Vektor mit 'c' funktioniert. Aber warum? – Rickard

+0

@Rickard Ich glaube, dass das Argument 'cols' einen Zeichenvektor benötigt, ähnlich wie' 'gather_cols' [Argument von' gather_'] (https://github.com/tidyverse/tidyr/issues/109#issuecomment-168024977). – aosmith

+0

Wenn ich jetzt diese Funktion mit einer anderen Funktion nutzen möchte. Wie soll ich vorgehen? z.B. c ("col_a", "col_b", "col_c")%>% walk (~ plot_nice_chart (df,.) gibt mir "spalte' .' ist unbekannt " – Rickard

Verwandte Themen