R: автозаполнение данных и дополнений дат в последовательности дат?

Я пытаюсь автоматически заполнить данные. Мне нужна команда для заполнения промежутков между датами: Предполагаемый вывод показывает промежутки с аналогичным приоритетом заполнения. Заполнение требует заполнить недостающие записи даты.

Как в R автоматически заполнять данные, заполняя промежутки между датами в некоторой последовательности дат?


Минимальные рабочие примеры

Ввод для последовательности дат (2016-12-25, 2017-01-05)

> aa<- data.frame(a=c(1,11,111),b=c(2,22,222),length=c(3,5,1),date=c(as.Date("28.12.2016",format="%d.%m.%Y"), as.Date("30.12.2016",format="%d.%m.%Y"), as.Date("01.01.2017",format="%d.%m.%Y")))
> 
> dateSeq<-seq.Date(as.Date("2016/12/25"), as.Date("2017/01/05"), "day")
> dateSeq
 [1] "2016-12-25" "2016-12-26" "2016-12-27" "2016-12-28" "2016-12-29"
 [6] "2016-12-30" "2016-12-31" "2017-01-01" "2017-01-02" "2017-01-03"
[11] "2017-01-04" "2017-01-05"

>
> aa
    a   b length       date
1   1   2      3 2016-12-28
2  11  22      5 2016-12-30
3 111 222      1 2017-01-01

который показывает записанные данные. Заполнения NA, показанные в некоторой степени Джоэлом Уилсоном, выполняются таким образом, что

dateSeq<-seq.Date(as.Date("2016/12/25"), as.Date("2017/01/05"), "day")
df<-data.frame(dateSeq)
df$date = as.Date(df$date, format = "%Y-%m-%d")
merge(df, aa, by = "date", all.x= TRUE)
     a   b       length  date
0.1  NA  NA      NA      2016-12-25
0.2  NA  NA      NA      2016-12-26
0.3  NA  NA      NA      2016-12-27
1    1   2       3       2016-12-28
0.4  NA  NA      NA      2016-12-29
2    11  22      5       2016-12-30
0.5  NA  NA      NA      2016-12-31
3    111 222     1       2017-01-01
0.6  NA  NA      NA      2017-01-02
0.7  NA  NA      NA      2017-01-03
0.8  NA  NA      NA      2017-01-04
0.9  NA  NA      NA      2017-01-05
0.10 NA  NA      NA      2017-01-06

где наша цель — заполнить записи NA чем-то, называемым similar precedence подходом, который зависит от его соседей.

Предполагаемый результат с добавлением даты ввода и аналогичным заполнением по приоритету

     a   b       length  date
0.1  0.9 2       3       2016-12-25
0.2  1   2.1     2       2016-12-26
0.3  0.8 2.2     3       2016-12-27
1    1   2       3       2016-12-28
0.4  10  20      4       2016-12-29
2    11  22      5       2016-12-30
0.5  80  150     3       2016-12-31
3    111 222     1       2017-01-01
0.6  100 130     5       2017-01-02
0.7  50  200     3       2017-01-03
0.8  20  100     2       2017-01-04
0.9  14  40      5       2017-01-05
0.10 80  140     4       2017-01-06

person Regan Alpha    schedule 28.12.2016    source источник
comment
все, что вам нужно сделать, это объединить, чтобы получить первый предполагаемый результат   -  person joel.wilson    schedule 28.12.2016
comment
да?... как вы получили значения для a, b и length?   -  person Sotos    schedule 28.12.2016
comment
@Sotos по подходу similar precedence, где значения аналогичны его соседям, я изначально использовал LOCF (последнее наблюдение перенесено вперед), но теперь пытаюсь найти лучшие альтернативы заполнению.   -  person Regan Alpha    schedule 28.12.2016
comment
есть ли функция или какие-либо ограничения для определения ваших требований к similar precedence?   -  person Sotos    schedule 28.12.2016
comment
@Sotos нет, я пытаюсь найти метод, который несколько близок к значениям вокруг него: модели скользящего среднего, модели авторегрессии и модели ARIMA могут быть некоторыми подходами, в которых предполагается, что данные действуют как временные ряды. Я понятия не имею, реализованы ли они в R для такого случая.   -  person Regan Alpha    schedule 28.12.2016
comment
но у вас есть только 1 значение для каждой переменной для начала. Как вы тогда будете прогнозировать?   -  person Sotos    schedule 28.12.2016
comment
@Sotos, например, с помощью скользящих средних: 2017-01-02 зависит от всех его предыдущих значений, где ближайшее, 2017-01-01, влияет на него больше всего. На это влияют такие значения, как 3 (2016-12-28), 5 (2016-12-30) и 1 (2017-01-01). Значения между 25-12-2016 и 27-12-2016 не могут быть предсказаны по предыдущим значениям, но мы можем оценить скользящие средние по столбцам.   -  person Regan Alpha    schedule 28.12.2016


Ответы (1)


Моя точка зрения была:

dateSeq<-seq.Date(as.Date("2016/12/25"), as.Date("2017/01/05"), "day")
df<-data.frame(dateSeq)
df
#          date
# 1: 2016-12-25
# 2: 2016-12-26
# 3: 2016-12-27
# 4: 2016-12-28
# 5: 2016-12-29
# 6: 2016-12-30
# 7: 2016-12-31
# 8: 2017-01-01
# 9: 2017-01-02
#10: 2017-01-03
#11: 2017-01-04
#12: 2017-01-05
#13: 2017-01-06

df$date = as.Date(df$date, format = "%Y-%m-%d")
merge(df, aa, by = "date", all.x= TRUE)
#          date   a   b length
# 1: 2016-12-25  NA  NA     NA
# 2: 2016-12-26  NA  NA     NA
# 3: 2016-12-27  NA  NA     NA
# 4: 2016-12-28   1   2      3
# 5: 2016-12-29  NA  NA     NA
# 6: 2016-12-30  11  22      5
# 7: 2016-12-31  NA  NA     NA
# 8: 2017-01-01 111 222      1
# 9: 2017-01-02  NA  NA     NA
#10: 2017-01-03  NA  NA     NA
#11: 2017-01-04  NA  NA     NA
#12: 2017-01-05  NA  NA     NA
#13: 2017-01-06  NA  NA     NA
person joel.wilson    schedule 28.12.2016
comment
Хороший вопрос +1, это для 1. Предполагаемый результат, поэтому автозаполнение файла 2. Предполагаемый результат по-прежнему отсутствует. - person Regan Alpha; 28.12.2016
comment
я не совсем понимаю, как вы на самом деле заполнили данные, поэтому я не могу двигаться дальше - person joel.wilson; 28.12.2016