web-dev-qa-db-ja.com

Rのサブグループの割合による要約

私はこのようなデータセットを持っています:

df = data.frame(group = c(rep('A',4), rep('B',3)),
                subgroup = c('a', 'b', 'c', 'd', 'a', 'b', 'c'),
                value = c(1,4,2,1,1,2,3))


group | subgroup | value
------------------------
  A   |    a     |  1
  A   |    b     |  4
  A   |    c     |  2
  A   |    d     |  1
  B   |    a     |  1
  B   |    b     |  2
  B   |    c     |  3

私が欲しいのは、各グループ内の各サブグループの値の割合を取得することです。つまり、出力は次のようになります。

group | subgroup | percent
------------------------
  A   |    a     |  0.125
  A   |    b     |  0.500
  A   |    c     |  0.250
  A   |    d     |  0.125
  B   |    a     |  0.167
  B   |    b     |  0.333
  B   |    c     |  0.500

グループA、サブグループAの例:値は1、グループA全体の合計は8(a = 1、b = 4、c = 2、d = 1)-したがって1/8 = 0.125

これまでのところ、thisのようなかなり単純な集計のみを見つけましたが、「除算」の方法を理解できませんサブグループ内の合計」の部分。

16
oliver13

コメントごとに、サブグループが一意の場合は、次のことができます

library(dplyr)
group_by(df, group) %>% mutate(percent = value/sum(value))
#   group subgroup value   percent
# 1     A        a     1 0.1250000
# 2     A        b     4 0.5000000
# 3     A        c     2 0.2500000
# 4     A        d     1 0.1250000
# 5     B        a     1 0.1666667
# 6     B        b     2 0.3333333
# 7     B        c     3 0.5000000

または、value列を削除し、percent列を同時に追加するには、transmuteを使用します

group_by(df, group) %>% transmute(subgroup, percent = value/sum(value))
#   group subgroup   percent
# 1     A        a 0.1250000
# 2     A        b 0.5000000
# 3     A        c 0.2500000
# 4     A        d 0.1250000
# 5     B        a 0.1666667
# 6     B        b 0.3333333
# 7     B        c 0.5000000
33
Rich Scriven