Завершите неделю на основе минимальной недели для каждого имени до текущей недели

#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