#r
Вопрос:
У меня есть фрейм данных, как показано ниже. Я хочу указать неделю и год для каждого имени на основе первой недели. То, что я ищу, — это всего лишь минимальная неделя каждого имени и заполнение до самой последней недели самого последнего года.
structure(list(Name = structure(c(1L, 1L, 2L, 2L), .Label = c("John", "Mary"), class = "factor"), Year = c(2021L, 2021L, 2020L, 2021L ), Week = c(1L, 5L, 3L, 5L), Total = c(3L, 2L, 1L, 2L)), class = "data.frame", row.names = c(NA, -4L))
Желаемый результат
Name Year Week Total John 2021 1 3 John 2021 2 0 John 2021 3 0 John 2021 4 0 John 2021 5 1 Mary 2020 3 1 Mary 2020 4 0 Mary 2020 5 0 . . . Mary 2021 4 0 Mary 2021 5 2
Мой код:
data %gt;% complete(Week = seq(min(Week), 53), fill = list(Total = 0)) fill(c(Name, year))
Комментарии:
1. Вероятно, добавление
group_by(Name, Year) %gt;%
послеdata %gt;%
и удалениеfill
оператора будет работать.2. Поэтому, если первая неделя для Мэри-3-я неделя 2020 года, то я хочу, чтобы данные были заполнены полностью до 5-й недели 2021 года. Таким образом, все недели 2020 года и все недели 2021 года до 5-й недели.
3. Я отредактировал свой ответ в соответствии с вашим комментарием 🙂
Ответ №1:
Решение состоит в том, чтобы преобразовать вашу дату в формат недели года и выполнить последовательность над ней. Я использую tsibble
это для этого.
library(tsibble); library(tidyr); library(dplyr) data %gt;% mutate(date = make_yearweek(Year,Week)) %gt;% group_by(Name) %gt;% complete(date = seq(min(date), max(date), by = 1), fill = list(Total = 0)) %gt;% mutate(Year = format(date, "%G"), Week = format(date, "%V")) Name date Year Week Total lt;fctgt; lt;weekgt; lt;chrgt; lt;chrgt; lt;dblgt; 1 John 2021 W01 2021 01 3 2 John 2021 W02 2021 02 0 3 John 2021 W03 2021 03 0 4 John 2021 W04 2021 04 0 5 John 2021 W05 2021 05 2 6 Mary 2020 W03 2020 03 1 7 Mary 2020 W04 2020 04 0 8 Mary 2020 W05 2020 05 0 9 Mary 2020 W06 2020 06 0 10 Mary 2020 W07 2020 07 0