2017-12-18 4 views
2

Ich habe einen großen Datensatz, von dem ich Zusammenfassungsschätzungen (Mittelwert, Mittelwerte, Zähler usw.) einer Spalte erhalten möchte, wenn sie nach zwei anderen Spalten gruppiert wird.Iterative Zusammenfassung nach Spaltenpaaren mit purrr map

Versuchen Sie wirklich schwer zu erarbeiten, wie dies mit purrr zu tun - hoffentlich diesen Workflow zu für zukünftige Projekte zu bekommen ... aber sehr fest.

Als reproduzierbares Beispiel funktioniert dies für die Gruppierung von am und vs und Abschätzen Summenwerte von mpg

library(tidyverse) 
library(rlang) 

mtcars %>% 
    group_by(am, vs) %>% 
    summarise(mean_mpg = mean(mpg), 
      median_mpg = median(mpg), 
      count = n()) 

, aber dieses Beispiel zu erweitern, sagen ich für am und vs zur Gruppe wollte; dann am und gear; dann am und carb. Intuitiv scheint dies etwas zu sein, das map behandeln sollte.

group_vars <- c("vs", "gear", "carb") 
group_syms <- rlang::syms(group_vars) 
sym_am <- rlang::sym("am") 

mtcars %>% 
    map_df(~group_by(!!sym_am, !!!group_syms) %>% 
      summarise(mean_mpg = mean(mpg), 
      summarise(median_mpg = median(mpg), 
      summarise(count = n()) 
) 

#Error in !sym_am : invalid argument type 

Antwort

1

wir die Verwendung könnte map2 von purrr mehrere Symbole als Argumente zu verwenden und dann innerhalb der group_by und summarise den Ausgang

auszuwerten
library(tidyverse) 
map2_df(list(sym_am), group_syms, ~ mtcars %>% 
     group_by(!!.x, !!.y) %>% 
     summarise(mean_mgp = mean(mpg), median_mpg = median(mpg),count = n())) 
+1

Danke - sehr elegant! Kann ich fragen, warum die 'liste (sym_am)' benötigt wird? Ich bekomme "Fehler:' .x' ist kein Vektor (Symbol) "wenn ich weglasse, aber ich dachte ich hätte es schon als Symbol aufgerufen? –

+1

@PeterMacPherson Verwenden Sie entweder 'c (sym_am)' oder 'list (sym_am)' legen Sie es in eine 'liste' und dann wird es speziell für' map' recycelt. Die 'base R' Map sollte ohne sie funktionieren – akrun

1

Hier ist ein Ansatz

library(tidyverse) 

variable_grp <- c("vs", "gear", "carb") 
constant_grp <- c("am") 
group_vars <- lapply(variable_grp, function(i) c(constant_grp, i)) 

map(group_vars, ~group_by_at(mtcars, .x) %>% 
       summarise( mean_mgp = mean(mpg), 
         median_mpg = median(mpg), 
         count = n())) 

Dies wird eine Liste der zusammenfassenden Statistiken für jede Gruppe erzeugen. Das Problem mit map_df mit Ihrem Problem ist, dass Ihre Spaltennamen für jede Gruppe unterschiedlich sind (1. Gruppe: am, vs; 2. Gruppe: am, Zahnrad ...). Daher müssen Sie die variable_column umbenennen, wenn Sie map_df

map_df(group_vars, ~group_by_at(mtcars, .x) %>% 
       summarise( mean_mgp = mean(mpg), 
         median_mpg = median(mpg), 
         count = n()) %>% 
       setNames(c("am", "variable_column", "mean_mpg", "median_mpg", "count"))) 

# A tibble: 17 x 5 
# Groups: am [2] 
     # am variable_column mean_mpg median_mpg count 
    # <dbl>   <dbl> <dbl>  <dbl> <int> 
# 1  0    0 15.05000  15.20 12 
# 2  0    1 20.74286  21.40  7 
# 3  1    0 19.75000  20.35  6 
# 4  1    1 28.37143  30.40  7 
# 5  0    3 16.10667  15.50 15 
# 6  0    4 21.05000  21.00  4 
# 7  1    4 26.27500  25.05  8 
# 8  1    5 21.38000  19.70  5 
# 9  0    1 20.33333  21.40  3 
# 10  0    2 19.30000  18.95  6 
# 11  0    3 16.30000  16.40  3 
# 12  0    4 14.30000  14.30  7 
# 13  1    1 29.10000  29.85  4 
# 14  1    2 27.05000  28.20  4 
# 15  1    4 19.26667  21.00  3 
# 16  1    6 19.70000  19.70  1 
# 17  1    8 15.00000  15.00  1 

mit sind, können Sie den variable_column Namen speichern mit dem .id Argument von map_df und eine post-map_df mutate

map_df(group_vars, ~group_by_at(mtcars, .x) %>% 
       summarise( mean_mgp = mean(mpg), 
         median_mpg = median(mpg), 
         count = n()) %>% 
       setNames(c("am", "variable_column", "mean_mpg", "median_mpg", "count")), 
      .id="variable_col_name") %>% 
      mutate(variable_col_name = variable_grp[as.numeric(variable_col_name)]) 

# A tibble: 17 x 6 
# Groups: am [2] 
    # variable_col_name am variable_column mean_mpg median_mpg count 
       # <chr> <dbl>   <dbl> <dbl>  <dbl> <int> 
# 1    vs  0    0 15.05000  15.20 12 
# 2    vs  0    1 20.74286  21.40  7 
# 3    vs  1    0 19.75000  20.35  6 
# 4    vs  1    1 28.37143  30.40  7 
# 5    gear  0    3 16.10667  15.50 15 
# 6    gear  0    4 21.05000  21.00  4 
# 7    gear  1    4 26.27500  25.05  8 
# 8    gear  1    5 21.38000  19.70  5 
# 9    carb  0    1 20.33333  21.40  3 
# 10    carb  0    2 19.30000  18.95  6 
# 11    carb  0    3 16.30000  16.40  3 
# 12    carb  0    4 14.30000  14.30  7 
# 13    carb  1    1 29.10000  29.85  4 
# 14    carb  1    2 27.05000  28.20  4 
# 15    carb  1    4 19.26667  21.00  3 
# 16    carb  1    6 19.70000  19.70  1 
# 17    carb  1    8 15.00000  15.00  1 
Verwandte Themen