1

group_by複数の変数を使用する場合、dplyrこれらのグループの共通点を見つけるのに役立ちます。

例えば、

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変数は、1 つの変数に 2 つの変数が含まれているという意味で整頓されていませんが、私の目的のために整頓されていることを約束します。OK? :))

4

3 に答える 3

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))
于 2016-11-28T19:01:40.790 に答える
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
于 2016-11-28T22:42:40.890 に答える