Совокупная сумма уникальных событий за каждый год

#r

Вопрос:

У меня есть фрейм данных, подобный этому:

 id <- c("1", "1", "1", "1", "1", "1", "2", "2", "2", "3")
year <- c(1900,1900,1900,1901,1902,1902,1900,1901,1901,1900)
event <- c('A','B','C','A','D','E','A','B','C','A')
df <- data.frame(id, year, event)
df

id   year   event
1    1900   A
1    1900   B
1    1900   C
1    1901   A
1    1902   D
1    1902   E
2    1900   A
2    1901   B
2    1901   C
3    1900   A
 

Каждое событие имеет соответствующий идентификатор и год наступления. Событие, произошедшее в прошлом, может повториться в том же идентификаторе. Каждый идентификатор переживает в течение года определенное количество уникальных событий. Например, для идентификатора=1 в год=1900 это число равно 3.

В качестве вывода я хотел бы получить комбинацию (идентификатор, год) с соответствующей совокупной суммой.

 id   year  cum_sum
1    1900  3
1    1901  3
1    1902  5
2    1900  1
2    1901  3
3    1900  1
 

Спасибо.

Ответ №1:

Вот один из вариантов —

Сохраните event значения в a list , используя setdiff функцию узнать, сколько новых event значений встречается в каждом year из них . Используйте cumsum , чтобы получить совокупную сумму за эти id «ы».

 library(dplyr)
library(purrr)

df %>%
  group_by(id, year) %>%
  summarise(list_event = list(event)) %>%
  mutate(cum_sum = map2_dbl(list_event, lag(list_event), ~length(setdiff(.x, .y))), 
         cum_sum = cumsum(cum_sum)) %>%
  ungroup %>%
  select(-list_event)

#  id     year cum_sum
#  <chr> <dbl>   <dbl>
#1 1      1900       3
#2 1      1901       3
#3 1      1902       5
#4 2      1900       1
#5 2      1901       3
#6 3      1900       1
 

Ответ №2:

Одним dplyr из вариантов может быть:

 df %>%
    group_by(id) %>%
    mutate(cum_sum = cumsum(!duplicated(event))) %>%
    group_by(id, year) %>%
    summarise(cum_sum = max(cum_sum))

  id     year cum_sum
  <chr> <dbl>   <int>
1 1      1900       3
2 1      1901       3
3 1      1902       5
4 2      1900       1
5 2      1901       3
6 3      1900       1