Сначала преобразуйте данные времени в класс, чтобы установить порядок, например, с помощью lubridate::myd
и truncated = 1
.Отсюда установите расположение строк, чтобы убедиться, что они в порядке, затем, сгруппированные по name
, используйте purrr::accumulate
, чтобы сгенерировать список уникальных значений, видимых до сих пор в moviewatched
, при вызове которого lengths
будетверните количество фильмов, просмотренных к этому моменту.Суммируйте по месяцам max
, чтобы получить общее количество типов за каждый месяц.
library(tidyverse)
df <- data_frame(
moviewatched = c('Comedy', 'Horror', 'Comedy', 'Horror', 'Drama', 'Comedy', 'Drama'),
name = c('john', 'john', 'john', 'john', 'john','kate','kate'),
time = lubridate::myd(c('1-2018', '1-2018', '1-2018', '2-2018', '2-2018','1-2018' ,'2-2018'), truncated = 1)
)
df %>%
group_by(name) %>%
arrange(name, time) %>%
mutate(n_types = lengths(accumulate(moviewatched, ~unique(c(...))))) %>%
group_by(name, time) %>%
summarise(n_types = max(n_types))
#> # A tibble: 4 x 3
#> # Groups: name [2]
#> name time n_types
#> <chr> <date> <dbl>
#> 1 john 2018-01-01 2
#> 2 john 2018-02-01 3
#> 3 kate 2018-01-01 1
#> 4 kate 2018-02-01 2