Странно: cumsum не работает на dplyr

Контекст: я хочу добавить столбец совокупной суммы в свою таблицу с именем words_uni. Я использовал библиотеку (dplyr), функцию mutate. Я работаю с R версии 3.4.1 64 бит - Windows 10 и RStudio версии 1.0.143

> head(words_uni)
# A tibble: 6 x 3
# Groups:   Type [6]
Type   Freq         per
<chr>  <int>       <dbl>
1   the 937839 0.010725848
2     i 918552 0.010505267
3    to 788892 0.009022376
4     a 615082 0.007034551

Затем я сделал следующее:

> words_uni1 = words_uni %>%
                      mutate( acum= cumsum(per))
> head(words_uni1)
# A tibble: 6 x 4
# Groups:   Type [6]
Type   Freq         per        acum
<chr>  <int>       <dbl>       <dbl>
1   the 937839 0.010725848 0.010725848
2     i 918552 0.010505267 0.010505267
3    to 788892 0.009022376 0.009022376
4     a 615082 0.007034551 0.007034551

Проблема: он не выполняет то, что я ожидал, и я не понимаю, почему.

Буду признателен за ваши комментарии. Заранее спасибо.


person Sergio    schedule 01.08.2017    source источник
comment
Почему вы группируете фрейм данных? Сгруппировано по Type.   -  person Andrew Brēza    schedule 01.08.2017
comment
@ AndrewBrēza спасибо за ваш комментарий. Я сгруппировал по типу в предыдущей команде, чтобы получить частоту на слово. Однако я не осознавал, что эта ситуация влияет на функцию cumsum.   -  person Sergio    schedule 02.08.2017


Ответы (1)


Вы, должно быть, предварительно сгруппировали тиблы по типам. Это заставляет ваш mutate вызов вычислять его по типу.

Вот воспроизводимый код:

require(readr)
require(dplyr)

x <- read_csv("type, freq, per
the, 937839, 0.010725848
i, 918552, 0.010505267
to, 788892, 0.009022376
a, 615082, 0.007034551")


### ungrouped tibble, desired results
x %>% mutate(acum = cumsum(per))

# A tibble: 4 x 4
type   freq         per       acum
<chr>  <int>       <dbl>      <dbl>
1   the 937839 0.010725848 0.01072585
2     i 918552 0.010505267 0.02123112
3    to 788892 0.009022376 0.03025349
4     a 615082 0.007034551 0.03728804

### grouped tibble
x %>% group_by(type) %>% mutate(acum = cumsum(per))

# A tibble: 4 x 4
# Groups:   type [4]
type   freq         per        acum
<chr>  <int>       <dbl>       <dbl>
1   the 937839 0.010725848 0.010725848
2     i 918552 0.010505267 0.010505267
3    to 788892 0.009022376 0.009022376
4     a 615082 0.007034551 0.007034551

Вам нужно просто разгруппировать свои данные.

word_uni %>% ungroup() %>% mutate(acum = cumsum(per))

Должен сделать свое дело.

person Beau    schedule 01.08.2017
comment
Спасибо @Beau Я не знал, что мне пришлось разгруппировать данные. Работает отлично! - person Sergio; 01.08.2017