#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