各大グループにおいて、各小グループの値がどの程度の割合を占めているのかを出す

昔、 r-wakalangで教えてもらったがメモってなかった話なのでメモっておく。 こういうデータ df があった時に

> df <- data.frame(
+   big_group=rep(letters[1:2], 30),
+   small_group=rep(1:3, 10),
+   value=runif(30)
+ )
> head(df, 10)
   big_group small_group      value
1          a           1 0.44153360
2          b           2 0.85443783
3          a           3 0.70604936
4          b           1 0.76551800
5          a           2 0.42258650
6          b           3 0.07403564
7          a           1 0.41088446
8          b           2 0.61669153
9          a           3 0.57614474
10         b           1 0.57685482

このデータの「各大グループにおいて、各小グループの値がどの程度の割合を占めているのか」を出す場合には以下のようにかく。 一回 summarizeかますとグルーピングが1個外れるってのがみそ(最終的には大グループでのみグルーピングされたデータになっている)。

> library(dplyr, warn.conflicts = FALSE)
> df %>%
+   dplyr::group_by(big_group, small_group) %>%
+   dplyr::summarise(sum_value = sum(value)) %>%
+   dplyr::mutate(ratio_value = sum_value / sum(sum_value))
# A tibble: 6 x 4
# Groups:   big_group [2]
  big_group small_group sum_value ratio_value
  <fct>           <int>     <dbl>       <dbl>
1 a                   1      3.93       0.307
2 a                   2      4.82       0.376
3 a                   3      4.06       0.317
4 b                   1      5.91       0.385
5 b                   2      6.37       0.416
6 b                   3      3.05       0.199