各大グループにおいて、各小グループの値がどの程度の割合を占めているのかを出す
昔、 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