2015-08-19 34 views
3

我有一些間歇需求數據,其中只包含需求存在的行。我通過read.csv將其引入,並且我的2列是Date(作爲日期)和Quantity(作爲整數)。然後我將它轉換爲動物園系列,並將每日需求結合到每月需求中。我的最終成果是一個動物園系列,日期是該月的第一天以及該月的總需求。向動物園時間系列添加零個月的零需求

我的問題是,這個動物園系列缺少在有零需求的月份之間,我需要這些來正確預測間歇性需求。

例如:我在2013-01-01的日期有數量2,然後下一行是2013-10-01的數量3。我需要將2013年1月1日到2013年9月1日之間的數量零增加到2013-02-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函數。在這種情況下,我們已經在上面創建了該日期向量。

現在合併爲缺失日期的行。對於quantity,新行將有NA。我們將在下面將這些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 =「dates」與兩個數據框匹配,現在我能夠獲取所有內容,轉換爲zoo系列,彙總爲每月需求,並根據每月需求執行Croston方法。 –

+0

我很高興它的工作馬特,雖然我認爲@亨利克的答案是更好的,如果你使用'動物園'對象。 – 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(「延伸的不規則系列到正規的一個」)。

相關問題