Заполните строки в фрейме данных в R

#r #dataframe #autofill

Вопрос:

У меня есть фрейм данных с информацией о покупках, совершенных клиентами с мая (202105) по октябрь 2021 года (202110). Клиенты не покупают каждый месяц, но я хочу заполнить эту информацию нулями. Мои данные выглядят так:

 soex lt;- data.frame(client_id = c("aaa","bbb","bbb","ccc","ccc","ddd","eee","eee","eee"),  v1 = c("xxx","xxx","xxx","yyy","yyy","xxx","yyy","xxx","yyy"),  first_buy = c("202105","202107","202107","202106","202106","202110","202107","202107","202107"),  sales_date = c("202105","202107","202109","202106","202110","202110","202107","202108","202109"),  qt_prod1 = c(10,60,30,2,45,11,14,167,145),  qt_prod2 = c(12,324,433,221,312,312,312,123,121))  
 client_id v1 first_buy sales_date qt_prod1 qt_prod2 1 aaa xxx 202105 202105 10 12 2 bbb xxx 202107 202107 60 324 3 bbb xxx 202107 202109 30 433 4 ccc yyy 202106 202106 2 221 5 ccc yyy 202106 202110 45 312 6 ddd xxx 202110 202110 11 312 7 eee yyy 202107 202107 14 312 8 eee xxx 202107 202108 167 123 9 eee yyy 202107 202109 145 121  
  • client_id = идентификатор клиента
  • v1 = случайная величина
  • first_buy = год и месяц первой покупки
  • дата продажи = год и месяц покупки. Первый всегда такой же, как и первый.
  • qi_prod1 (и 2) = количество купленного товара

Что мне нужно, так это фрейм данных, который выглядит следующим образом:

 ideal lt;- data.frame(client_id = c("aaa","aaa","aaa","aaa","aaa","aaa","bbb","bbb","bbb","bbb","ccc","ccc","ccc","ccc","ccc","ddd","eee","eee","eee","eee"),  v1 = c("xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","yyy","yyy","yyy","yyy","yyy","xxx","yyy","xxx","yyy","yyy"),  first_buy = c("202105","202105","202105","202105","202105","202105","202107","202107","202107","202107","202106","202106","202106","202106","202106","202110","202107","202107","202107","202107"),  sales_date = c("202105","202106","202107","202108","202109","202110","202107","202108","202109","202110","202106","202107","202108","202109","202110","202110","202107","202108","202109","202110"),  qt_prod1 = c(10,0,0,0,0,0,60,0,0,30,2,0,0,0,45,11,14,167,145,0),  qt_prod2 = c(12,0,0,0,0,0,324,0,0,433,221,0,0,0,312,312,312,123,121,0))  
 client_id v1 first_buy sales_date qt_prod1 qt_prod2 1 aaa xxx 202105 202105 10 12 2 aaa xxx 202105 202106 0 0 3 aaa xxx 202105 202107 0 0 4 aaa xxx 202105 202108 0 0 5 aaa xxx 202105 202109 0 0 6 aaa xxx 202105 202110 0 0 7 bbb xxx 202107 202107 60 324 8 bbb xxx 202107 202108 0 0 9 bbb xxx 202107 202109 0 0 10 bbb xxx 202107 202110 30 433 11 ccc yyy 202106 202106 2 221 12 ccc yyy 202106 202107 0 0 13 ccc yyy 202106 202108 0 0 14 ccc yyy 202106 202109 0 0 15 ccc yyy 202106 202110 45 312 16 ddd xxx 202110 202110 11 312 17 eee yyy 202107 202107 14 312 18 eee xxx 202107 202108 167 123 19 eee yyy 202107 202109 145 121 20 eee yyy 202107 202110 0 0  

Моя проблема возникает особенно тогда, когда мне приходится учитывать переменную first_buy. Как вы можете видеть в случае с клиентом «bbb», я не хочу, чтобы данные начинались в мае 2021 года… Я хочу, чтобы это началось с первого месяца покупки до 202110 года.

Моя другая проблема заключается в том, чтобы заполнить информацию переменной V1 информацией о дате продажи. Если вы видите, например, случай с клиентом «eee», она не покупала в 202110 году, но в V1 у нее есть информация о 202109

Спасибо,

Ответ №1:

Один tidyverse из вариантов —

  • Изменение sales_date объекта на дату
  • Для каждого client_id создайте ежемесячную последовательность дат
  • fill first_buy и v1 колонны.
 library(dplyr) library(tidyr) library(lubridate)  soex %gt;%  mutate(sales_date = ymd(paste0(sales_date, '01'))) %gt;%  group_by(client_id) %gt;%  complete(sales_date = seq(min(sales_date), ymd('20211001'), by = 'month'),   fill = list(qt_prod1 = 0, qt_prod2 = 0)) %gt;%  mutate(sales_date = format(sales_date, '%Y%m')) %gt;%  fill(first_buy, v1) %gt;%  ungroup()  # client_id sales_date v1 first_buy qt_prod1 qt_prod2 # lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;dblgt; lt;dblgt; # 1 aaa 202105 xxx 202105 10 12 # 2 aaa 202106 xxx 202105 0 0 # 3 aaa 202107 xxx 202105 0 0 # 4 aaa 202108 xxx 202105 0 0 # 5 aaa 202109 xxx 202105 0 0 # 6 aaa 202110 xxx 202105 0 0 # 7 bbb 202107 xxx 202107 60 324 # 8 bbb 202108 xxx 202107 0 0 # 9 bbb 202109 xxx 202107 30 433 #10 bbb 202110 xxx 202107 0 0 #11 ccc 202106 yyy 202106 2 221 #12 ccc 202107 yyy 202106 0 0 #13 ccc 202108 yyy 202106 0 0 #14 ccc 202109 yyy 202106 0 0 #15 ccc 202110 yyy 202106 45 312 #16 ddd 202110 xxx 202110 11 312 #17 eee 202107 yyy 202107 14 312 #18 eee 202108 xxx 202107 167 123 #19 eee 202109 yyy 202107 145 121 #20 eee 202110 yyy 202107 0 0