Итак, у меня есть datatable df с идентификатором столбца DATE и STOCK
В этой таблице один и тот же идентификатор имеет несколько значений с их датой и запасом:
ID DATE STOCK
a1 2017-05-04 1
a1 2017-06-04 4
a1 2017-06-05 1
a1 2018-05-04 1
a1 2018-06-04 3
a1 2018-06-05 1
a2 2016-11-26 2
a2 ... ..
Используя lubridate, я могуполучить, на какой неделе дата выглядит следующим образом:
dfWeeks=df[,"WEEK" := floor_date(df$`Date`, "week")]
ID DATE STOCK WEEK
a1 2017-05-04 1 2017-04-30
a1 2017-06-04 4 2017-06-04
a1 2017-06-05 1 2017-06-04
a1 2018-05-04 1 2018-04-29
a1 2018-06-04 3 2018-06-03
a1 2018-06-05 1 2018-06-03
a2 2016-11-26 2 2016-11-20
a2 ... ..
Итак, из столбца ДАТА я знаю, что моя старая дата 2017-05-04
, а самая новая дата 2018-06-05
, которая имеет около 56.71429 недель:
dates <- c( "2017-05-04","2018-06-05")
dif <- diff(as.numeric(strptime(dates, format = "%Y-%m-%d")))/(60 * 60 * 24 * 7)
И в моей таблице всего 4 уникальных недели, поэтому идея состоит в том, чтобы суммировать запасы для каждой недели и вставлять недостающие (57-4 = 53 недели) со значением 0 в наличии.
Тогда я могу использовать среднее значение всех недель, например
meanStock<- dfWeeks[, .(mean=sum(Stock, na.rm = T)/dif <- diff(as.numeric(strptime(c(min(Date), max(Date)), format = "%Y-%m-%d")))/(60 * 60 * 24 * 7) ), by = .(ID)]
Но я не знаю, сработает ли это, надеюсь, я дал понять, и любые советы или подходы приветствуются.
ОБНОВЛЕНИЕ:
Вот так я получаю максимальную и минимальную дату
max = aggregate(df$`Date`,by=list(df$ID),max)
colnames(max) = c("ID", "MAX")
min = aggregate(df$`Date`,by=list(df$ID),min)
colnames(min) = c("ID", "MIN")
test <- merge(max, min, by="ID", all=T)