2016-07-04 13 views
5

Rozważmy przykład daneDzielenie kolumna ramka danych zawiera listę na wielu kolumnach pomocą dplyr (lub inaczej)

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

tak, że mpg_sum zawiera minimalną, 1 kwartyl, mediana, oznacza, 3 kwartyl, a maks. zmiennej mpg według grup w cyl.

Jak rozpakować tę kolumnę do 6 kolumn z odpowiednimi nazwami kolumn za pomocą dplyr lub w inny sposób?

+4

Można również użyć 'biblioteka (miotła); mtcars%>% group_by (cyl)%>% do (tidy (summary (. $ mpg))) ' –

+0

możesz napisać to jako odpowiedź. Zawsze interesowałem się miotłą. – Alex

+2

Wariacja na temat: 'mtcars%>% group_by (cyl)%>% summary (summary = list (broom :: tidy (summary (mpg))))%>% tidyr :: unnest()' – alistaire

Odpowiedz

12

Możemy użyć data.table. Konwersja 'data.frame' do 'data.table' (as.data.table(mtcars)), pogrupowane według 'cyl', otrzymujemy summary z 'mpg' i przekształcić go 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 

lub używając tylko dplyr, po zgrupowaniu przez "cyl", używamy do, aby wykonać tę samą operację jak powyżej.

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 

lub używając purrr

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

to wygląda naprawdę dobrze ... automatyczne nazywanie z 'data.table' jest znacznie lepsze, ponieważ nie musisz podawać check.names – Alex

+0

, więc jest problem z' dplyr :: do' w poczucie, że opuszcza wszystkie kolumny, z wyjątkiem grupy. Na przykład 'mtcars%>% group_by (cyl)%>% mutate (mpg_sum = list (summary (mpg)))'. Jeśli rozpakujesz tę listę, pozostałe kolumny tabeli znikną. – Alex

+0

Wygląda na to, że 'data.table' zapewnia rozwiązanie, którego' dplyr' nie może, ponieważ możesz bardzo łatwo przypisać wiele wyjść jednego wywołania funkcji do wielu nazwanych kolumn. – Alex

4

(lub inaczej) opcja korzystania sapply():

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

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

4

Inną opcją

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

Jak zauważył, można również użyć funkcji tidy z pakietu 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 
Powiązane problemy