Группировка по нескольким измерениям, суммирование и добавление вычисляемого столбца - PullRequest
2 голосов
/ 17 июня 2019

У меня есть этот df:

  boxChange   sameCat
# C1 > C2     TRUE
# C1 > C2     TRUE
# A0 > A1     TRUE
# A1 > E4     FALSE
# C3 > E6     FALSE
# E0 > E3     TRUE
# ...         ...

Я бы хотел сгруппировать по обоим столбцам, посчитать вхождения и расположить их по количеству Используя dplyr, я бы пошел так:

df2 <- df %>%  
group_by(boxChange, sameCat) %>%
summarise(occs = n()) %>%
arrange(desc(occs))

Получение:

  boxChange   sameCat   occs
# C1 > C2     TRUE      312
# A0 > A1     TRUE      189
# E0 > E3     TRUE      13
# C3 > E6     FALSE     123
# A1 > E4     FALSE     70

Теперь я хотел бы вычислить процент каждого occs по отношению к общему и совокупному проценту, получив что-то вроде этого

  boxChange   sameCat   occs   perc   cump
# C1 > C2     TRUE      312    44      44
# A0 > A1     TRUE      189    27      71
# E0 > E3     TRUE       13     2      73
# C3 > E6     FALSE     123    17      90
# A1 > E4     FALSE      70    10     100

Я пробовал со следующим

df2 <- df %>%  
group_by(boxChange, sameCat) %>%
summarise(occs = n()) %>%
arrange(desc(occs)) %>%
mutate(perc = occs/sum(occs)*100) %>%
mutate(cump = cumsum(perc))

Но вывод выглядит следующим образом

  boxChange   sameCat   occs   perc   cump
# C1 > C2     TRUE      312    100     100
# A0 > A1     TRUE      189    100     100
# E0 > E3     TRUE       13    100     100
# C3 > E6     FALSE     123    100     100
# A1 > E4     FALSE      70    100     100

Я не могу понять, почему это так, и не смог найти ни одного другого потока, сообщающего о подобной проблеме. Есть ли у вас понимание?

1 Ответ

1 голос
/ 18 июня 2019

Нам может понадобиться ungroup

df2 <- df %>%  
       group_by(boxChange, sameCat) %>%
        summarise(occs = n()) %>%
        arrange(desc(occs)) %>%
        ungroup %>%
        mutate(perc = occs/sum(occs)*100, 
               cump = cumsum(perc))

-

Или, если нам нужно сохранить группировку без изменений, используйте sum(.$occs)

Обновление

Если мы начнем с ОП arraged 'occs'

df %>% 
  ungroup %>% 
  mutate(perc = round(occs/sum(occs) * 100),
         cump = cumsum(perc))
#   boxChange sameCat occs perc cump
#1   C1 > C2    TRUE  312   44   44
#2   A0 > A1    TRUE  189   27   71
#3   E0 > E3    TRUE   13    2   73
#4   C3 > E6   FALSE  123   17   90
#5   A1 > E4   FALSE   70   10  100
...