R - оценка недостающих значений
Давайте предположим, что у меня есть таблица как таковая:
Date Sales
09/01/2017 9000
09/02/2017 12000
09/03/2017 0
09/04/2017 11000
09/05/2017 14400
09/06/2017 0
09/07/2017 0
09/08/2017 21000
09/09/2017 15000
09/10/2017 23100
09/11/2017 0
09/12/2017 32000
09/13/2017 8000
Значения в таблице оцениваются R-программой, к которой у меня нет доступа (сейчас это черный ящик). Теперь есть несколько дней с нулевыми значениями, которые имеют тенденцию ползти из-за проблем в нашем процессе приема /ETL. Мне нужно оценить значения для дат с 0 данных.
Наш подход заключается в следующем:
- Нарисуйте линию от даты до пропущенных данных до даты сразу после пропущенных данных
- Оцените значение для отсутствующей даты из строки
Теперь, если есть только один день с пропущенными данными между двумя хорошими днями, сработает прямое среднее. Если есть два или более дня подряд с отсутствующими данными, среднее значение не будет работать, поэтому я пытаюсь сформулировать способ оценки значений для нескольких точек данных.
Будет ли этот подход работать в R? Я всего n00b в R, так что я не совсем уверен, возможно ли это вообще.
2 ответа
Вы можете заполнить значения с помощью линейной интерполяции, используя функцию approxfun
,
## Your data
df = read.table(text="Date Sales
09/01/2017 9000
09/02/2017 12000
09/03/2017 0
09/04/2017 11000
09/05/2017 14400
09/06/2017 0
09/07/2017 0
09/08/2017 21000
09/09/2017 15000
09/10/2017 23100
09/11/2017 0
09/12/2017 32000
09/13/2017 8000",
header=TRUE, stringsAsFactors=FALSE)
df$Date = as.Date(df$Date, format="%m/%d/%Y")
## Create function for linear interpolation
Interp = approxfun(df[df$Sales > 0, ])
## Use function to fill in interpolated values
Vals = Interp(df$Date[df$Sales == 0])
df$Sales[df$Sales == 0] = Vals
plot(df, type="l")
grid()
Мы также можем использовать na.interpolation
функция от imputeTS
пакет. Метод по умолчанию na.interpolation
линейная интерполяция, но мы также можем указать другие методы, если мы хотим.
library(dplyr)
library(imputeTS)
dt2 <- dt %>%
replace(. == 0, NA) %>%
mutate(Sales = na.interpolation(Sales))
dt2
Date Sales
1 09/01/2017 9000
2 09/02/2017 12000
3 09/03/2017 11500
4 09/04/2017 11000
5 09/05/2017 14400
6 09/06/2017 16600
7 09/07/2017 18800
8 09/08/2017 21000
9 09/09/2017 15000
10 09/10/2017 23100
11 09/11/2017 27550
12 09/12/2017 32000
13 09/13/2017 8000
Данные
dt <- read.table(text = "Date Sales
09/01/2017 9000
09/02/2017 12000
09/03/2017 0
09/04/2017 11000
09/05/2017 14400
09/06/2017 0
09/07/2017 0
09/08/2017 21000
09/09/2017 15000
09/10/2017 23100
09/11/2017 0
09/12/2017 32000
09/13/2017 8000",
header = TRUE, stringsAsFactors = FALSE)