У меня есть df, который содержит идентификатор пользователя, дату начала и окончания подписки и, если доступно, дату активности. Пользователи могут появляться более одного раза, если у них несколько дат активности. Ниже приведен небольшой пример игрушки:
USER_ID SUB_START SUB_END ACTIVITY_DATE
0102 2018-01-02 2018-01-07 NA
2190 2018-01-01 2018-01-06 2018-01-02
2432 2018-01-03 2018-01-07 2018-01-03
0121 2018-01-03 2018-01-04 2018-01-02
0121 2018-01-02 2018-01-07 2018-01-04
То, что я хотел бы выполнить, sh - это сгруппировать по неделям, а затем показать количество уникальных идентификаторов, которые имели активную подписку на этой неделе, и количество уникальных идентификаторов. на этой неделе был хотя бы 1 день активности. Таким образом, выходные данные для этого набора данных игрушки будут выглядеть так:
WEEK ACTIVE_COUNT ACTIVITY_COUNT
2018-0 4 3
Этот пример упрощен, время между датами SUB_START и SUB_END может быть намного больше. Я пытаюсь подумать, как подойти к этой проблеме. Мне нужно создать столбец WEEK, содержащий каждую неделю от самого маленького format(SUB_START), "%y-%U")
до самого большого format(as.Date(SUB_END), "%Y-%U")
. Я считаю, что могу выполнить sh с чем-то вроде complete(WEEK = seq.Date(SUB_START, unit = "week"), SUB_END, by = "week"))
. Однако я не уверен, как я могу затем go в течение каждой недели и подсчитывать количество уникальных идентификаторов, которые были активны в течение этой недели, и подсчитывать количество уникальных активных идентификаторов, у которых был хотя бы один ACTIVITY_DATE в течение этой недели.
РЕДАКТИРОВАТЬ: Используя структуру @ TimTeaFan, я приблизился со следующим кодом:
dat %>%
mutate(across(where(is.character), ~ floor_date(as.Date(.x) - 1, "weeks") + 1)) %>%
rowwise() %>%
mutate(WEEK = list(seq(SUB_START,SUB_END, by = "+1 week"))) %>%
unnest(WEEK) %>%
mutate(WEEK2 = format(WEEK, "%Y-%U")) %>%
mutate(ENCOUNTER_WEEK = format(ACTIVITY_DATE, "%Y-%U")) %>%
group_by(WEEK2) %>%
mutate(ACTIVE = ifelse(!is.na(ACTIVITY_DATE), ENCOUNTER_WEEK == WEEK2, NA)) %>%
summarise(ACTIVE_COUNT = sum(!is.na(USER_ID)),
ACTIVITY_COUNT = sum(ACTIVE, na.rm = TRUE))
Однако это дает общее ACTIVITY_COUNT
, а не уникальное количество идентификаторов с активностью на этой неделе
EDIT2: решено ниже