2016-07-04 16 views
5

consideri il seguente esempio datiSplit una colonna frame di dati contenente un elenco in più colonne utilizzando dplyr (o altro)

library(dplyr) 
tmp <- mtcars %>% 
    group_by(cyl) %>% 
    summarise(mpg_sum = list(summary(mpg))) 

tale che mpg_sum contiene min, 1 ° quartile, mediana, media, 3 ° quartile, e max della variabile per gruppi in cyl.

Come si scompatta questa colonna in 6 colonne con i nomi di colonna appropriati con dplyr o altrimenti?

+4

È inoltre possibile utilizzare 'libreria (scopa); mtcars%>% group_by (cyl)%>% do (ordine (sommario (. $ mpg))) ' –

+0

puoi postare questo come risposta. Mi sono sempre interessato alla scopa. – Alex

+2

Variazione su un tema: 'mtcars%>% group_by (cili)%>% riepiloga (riepilogo = lista (broom :: tidy (riepilogo (mpg))))%>% tidyr :: unnest()' – alistaire

risposta

12

Possiamo usare data.table. Convertire il 'data.frame' a 'data.table' (as.data.table(mtcars)), raggruppati per 'cil', si ottiene il summary di 'mpg' e convertirlo in list

library(data.table) 
as.data.table(mtcars)[, as.list(summary(mpg)), by = cyl] 
# cyl Min. 1st Qu. Median Mean 3rd Qu. Max. 
#1: 6 17.8 18.65 19.7 19.74 21.00 21.4 
#2: 4 21.4 22.80 26.0 26.66 30.40 33.9 
#3: 8 10.4 14.40 15.2 15.10 16.25 19.2 

o utilizzando solodplyr, dopo il raggruppamento per 'cyl', usiamo do per fare la stessa operazione di cui sopra.

library(dplyr) 
mtcars %>% 
    group_by(cyl) %>% 
    do(data.frame(as.list(summary(.$mpg)), check.names=FALSE)) 
# cyl Min. 1st Qu. Median Mean 3rd Qu. Max. 
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#1  4 21.4 22.80 26.0 26.66 30.40 33.9 
#2  6 17.8 18.65 19.7 19.74 21.00 21.4 
#3  8 10.4 14.40 15.2 15.10 16.25 19.2 

o utilizzando purrr

library(purrr) 
mtcars %>% 
    slice_rows("cyl") %>% 
    select(mpg) %>% 
    by_slice(dmap, summary, .collate= "cols") 
+3

questo sembra davvero buono ... la denominazione automatica da 'data.table' è molto meglio in quanto non è necessario specificare check.names – Alex

+0

quindi c'è un problema con' dplyr :: do' in il senso che cade tutte le colonne tranne quella di gruppo. Ad esempio, 'mtcars%>% group_by (cyl)%>% mutate (mpg_sum = list (summary (mpg)))'. Se si scompatta questa lista, le altre colonne della tabella scompaiono. – Alex

+0

Sembra che 'data.table' fornisca una soluzione che' dplyr' non può, in quanto si può facilmente assegnare più uscite di una chiamata di funzione a più colonne con nome. – Alex

4

(o altro) opzione utilizzando sapply():

t(sapply(split(mtcars$mpg, mtcars$cyl), summary)) 
+5

Oppure 'do.call (rbind, da (mtcars $ mpg, mtcars $ cyl, FUN = summary)) ' – akrun

4

Un'altra opzione

with(data = mtcars,by(mpg,cyl,FUN = summary)) 
9

come ha commentato, è anche possibile utilizzare la funzione tidy dal pacchetto broom:

library(broom) 
mtcars %>% group_by(cyl) %>% do(tidy(summary(.$mpg))) 
# Source: local data frame [3 x 7] 
# Groups: cyl [3] 
# 
#  cyl minimum q1 median mean q3 maximum 
# (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) 
# 1  4 21.4 22.80 26.0 26.66 30.40 33.9 
# 2  6 17.8 18.65 19.7 19.74 21.00 21.4 
# 3  8 10.4 14.40 15.2 15.10 16.25 19.2 
Problemi correlati