2016-11-28 76 views
1

group_by複数変数の場合、dplyrはこれらのグループの共通部分を見つけやすくなります。例えばdplyr :: group_by()複数の変数があるが交差しない場合

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

利回り

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 

私の質問は、複数の変数を提供する方法はありますが、わずかにをを要約しますか?私はあなたが手でこれをするなら、あなたが得るもののような出力を、可変で変数にしたい。

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) 

上記のコードは、理想的には、

# 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 

をもたらし、構文は
mtcars %>% 
group_by(cyl, am, intersection = FALSE) %>% 
summarise(est = mean(disp)) 

はこのようなものがtidyverseに存在するか

のようなものでしょうか?

(PS、私は上記の表の私のgroup変数は、それが一つに二つの変数が含まれているという意味で、きちんとしていないことを得るが、私はOK、それはきちんとだ私の目的のために約束?:))

答えて

4

私はあなたが探しているものは、tidyrパッケージです。

gather最初にグループ化される各要因ごとにn個の行があるようにデータセットを複製します。 mutateはグループ化変数を作成します。

library(dplyr) 
library(tidyr) 

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

これは素晴らしいソリューションです。より一般的にするための小さな編集 df%>% % mutate(group = paste0(col、 "_"、value)) –

+0

賛成、私は編集しました答え – denrou

1

purrr代替:

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 
関連する問題