2015-08-19 14 views
3

У меня есть некоторые данные о прерывистом требовании, которые включают только строки, где присутствует спрос. Я ввожу его через read.csv, а мои 2 столбца - это дата (как дата) и количество (как целое число). Затем я конвертирую его в зоопарк и комбинирую ежедневный спрос в ежемесячный спрос. Мой конечный результат - серия зоопарков с датой, которая является первым днем ​​месяца и суммарным спросом на этот месяц.Добавить месяцы нулевого спроса на временные ряды зоопарков

Моя проблема заключается в том, что в этой серии зоопарков отсутствуют промежутки между месяцами, которые имеют нулевой спрос, и мне нужно, чтобы они правильно прогнозировали прерывистый спрос.

Например: У меня есть количество 2 в дата 2013-01-01, а затем следующая строка - количество 3 в 2013-10-01. Мне нужно добавить количество ноль до 2013-02-01 по 2013-09-01.

Date <- c('1/1/2013','10/1/2013','11/1/2013') 
Quantity <- c('2','3','6') 

Date <- as.Date(Date, "%m/%d/%Y") 

df <- data.frame(Date, Quantity) 
df <- read.zoo(df) 
df 

Выходной зоопарк серии:

2013-01-01 2013-10-01 2013-11-01 
     2   3   6 
+1

Просьба представить [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), что означает образец данных, код, который вы пробовали , ожидаемый вывод и любые сообщения об ошибках. – eipi10

+0

Я сделаю снимок. –

ответ

0

Вы можете использовать merge добавить недостающие строки, а затем установить их значения до нуля.

Во-первых, давайте создадим некоторые поддельные данные:

# Vector of dates from Jan 1, 2015, to Mar 31, 2015 
dates = seq(as.Date("2015-01-01"), as.Date("2015-03-31"), by="1 day") 

# Let's create data for few of these dates, leaving some out 
set.seed(55) 
dat = data.frame(dates=dates[sample(1:length(dates), 70)], 
       quantity=sample(1:10, 70, replace=TRUE)) 
dat = dat[order(dat$dates),] 

Теперь давайте притворяются dat является то, что вы импортировать из файла CSV. Мы хотим заполнить quantity = 0 для отсутствующих дат. Поэтому сначала нам нужно добавить строки для отсутствующих дат. Вы можете сделать это, создав вектор даты, содержащий все даты с первой даты до последней даты в вашем файле csv и используя функцию merge. В этом случае мы уже создали этот вектор даты выше.

Теперь объедините строки для отсутствующих дат. Новые строки будут иметь NA для quantity. Мы изменим эти NA s до нуля ниже.

dat = merge(data.frame(dates), dat, by="dates", all.x=TRUE) 

# Set missing values to zero 
dat$quantity[is.na(dat$quantity)] = 0 

Теперь вы можете агрегировать в месяц, конвертировать в серии zoo и т.д.

+0

Это отлично работало eipi10, спасибо! У меня было что-то подобное, но слияние не работало. Я изменил конфигурацию именования вокруг так: by = «даты» в функции слияния, сопоставленной для обоих фреймов данных, и теперь мне удалось получить все, конвертировать в серии зоопарков, агрегировать в ежемесячный спрос и выполнять метод Кростона по ежемесячному спросу , –

+0

Я рад, что это сработало Мэттом, хотя я думаю, что ответ Хенрика лучше, если вы используете объекты 'zoo'. – eipi10

6

Поскольку «DF» является zoo объект, вы можете использовать merge.zoo и его fill аргумент. Текущий набор данных объединяется с пустым объектом zoo, который содержит все нужные даты.

tt <- seq(min(Date), max(Date), "month") 
merge(df, zoo(, tt), fill = 0) 

# 2013-01-01 2013-02-01 2013-03-01 2013-04-01 2013-05-01 2013-06-01 2013-07-01 2013-08-01 2013-09-01 2013-10-01 2013-11-01 
#   2   0   0   0   0   0   0   0   0   3   6 

Дополнительные примеры см ?merge.zoo («продлить неправильную серию к обычному одному»).