2016-11-28 4 views
1

Wenn Sie group_by mehrere Variablen, findet dplyr hilfreich die Schnittmenge dieser Gruppen.dplyr :: group_by() mit mehreren Variablen, aber nicht Schnittpunkt

Zum Beispiel

mtcars %>% 
    group_by(cyl, am) %>% 
    summarise(mean(disp)) 

ergibt

Source: local data frame [6 x 3] 
Groups: cyl [?] 

    cyl am `mean(disp)` 
    <dbl> <dbl>  <dbl> 
1  4  0  135.8667 
2  4  1  93.6125 
3  6  0  204.5500 
4  6  1  155.0000 
5  8  0  357.6167 
6  8  1  326.0000 

Meine Frage ist, gibt es eine Möglichkeit, mehrere Variablen zur Verfügung zu stellen, abergeringfügig zusammenfassen? Ich möchte die Ausgabe wie das, was Sie bekommen, wenn Sie dies manuell tun, Variable für Variable.

df_1 <- 
    mtcars %>% 
    group_by(cyl) %>% 
    summarise(est = mean(disp)) %>% 
    transmute(group = paste0("cyl_", cyl), est) 

df_2 <- 
    mtcars %>% 
    group_by(am) %>% 
    summarise(est = mean(disp)) %>% 
    transmute(group = paste0("am_", am), est) 

bind_rows(df_1, df_2) 

Der obige Code liefert

# A tibble: 5 × 2 
    group  est 
    <chr> <dbl> 
1 cyl_4 105.1364 
2 cyl_6 183.3143 
3 cyl_8 353.1000 
4 am_0 290.3789 
5 am_1 143.5308 

Idealfall würde die Syntax etwas wie

mtcars %>% 
group_by(cyl, am, intersection = FALSE) %>% 
summarise(est = mean(disp)) 
sein

Ist so etwas in der tidyverse existieren?

(ps, ich bekomme, dass meine group Variable in der Tabelle oben in dem Sinne nicht ordentlich ist, dass es zwei Variablen in einem, aber ich verspreche, für meine Zwecke ordentlich es ist, OK? :))

Antwort

4

Ich rate, was Sie suchen, ist das tidyr Paket ...

gather zuerst dupliziert das Dataset, so dass es n Zeilen für jeden Faktor gibt, nach dem Gruppierung auftreten wird; mutate erstellt dann die Gruppierungsvariable.

library(dplyr) 
library(tidyr) 

mtcars %>% 
    gather(col, value, cyl, am) %>% 
    mutate(group = paste(col, value, sep = "_")) %>% 
    group_by(group) %>% 
    summarise(est = mean(disp)) 
+0

Dies ist eine großartige Lösung. Kleine Bearbeitung, um allgemeiner zu machen df%>% sammeln (col, Wert, X1, X2, X3, X4)%>% mutieren (Gruppe = Paste0 (col, "_", Wert)) –

+0

Zustimmen, ich bearbeitet die Antwort – denrou

1

A purrr Alternative:

library(tidyverse) 

map(c('cyl', 'am'), 
    ~ mtcars %>% 
     group_by_(.x) %>% 
     summarise(est = mean(disp)) %>% 
     transmute_(group = lazyeval::interp(~paste0(.x, '_', y), y = as.name(.x)), 
       ~est)) %>% 
    bind_rows() 
# A tibble: 5 × 2 
    group  est 
    <chr> <dbl> 
1 cyl_4 105.1364 
2 cyl_6 183.3143 
3 cyl_8 353.1000 
4 am_0 290.3789 
5 am_1 143.5308 
Verwandte Themen