2016-11-15 57 views
1

對於任何不遵守發佈問題的規則,我提前表示歉意。下面的數據表是我想要轉換成時間序列的樣本。由於重複日期,無法將零需求日期添加到動物園時間序列

> Materials 
MaterialID Date  Quantity 
    1  2011-01-04  13 
    1  2011-01-04  5 
    2  2011-01-07  9 
    3  2011-01-09  3 
    3  2011-01-11  10 

它由事務條目爲2011- 2014.The日期範圍整個數據集之間的若干重大項目是從2011年1月4日 - 12月31日2014年我要爲每一個材料事務條目在此期間內,通過將缺失日期的Quantity變量設置爲零來計算缺失日期。換一種方式,我想要的結果是,將有每一種材料在數據集中的1月4日之間的每個日期的條目,2011 - 如下圖所示2014年12月31日:

Date MaterialID_1 MaterialID_2 MaterialID_3 
2011-01-04 13    0   0 
2011-01-04 5    0   0 
2011-01-05 0    0   0 
2011-01-06 0    0   0 
2011-01-07 0    9   0 
2011-01-08 0    0   0 
2011-01-09 0    0   3 
2011-01-10 0    0   10 
2011-01-11 0    0   0 
    .   .    .   . 
    .   .    .   . 
    .   .    .   . 
2014-12-31 0    0   0 

我已經嘗試了一些我在論壇中看到的方法如Add months of zero demand to zoo time series,但是因爲我有重複的日期,所以出現錯誤,「order.by'中的索引條目不是唯一的。我很感激任何建議或幫助,我可以得到這一點。

將數據轉換爲此格式後,我的意圖是重新整理數據集以進行批量預測。謝謝。

見下dput代碼:

dput(Data) 
structure(list(MaterialID = c(1L, 1L, 2L, 3L, 1L), Date = c("2011-01-04", 
"2011-01-04", "2011-01-07", "2011-01-09", "2011-01-11"), Quantity = c(13L, 
5L, 9L, 3L, 10L)), .Names = c("MaterialID", "Date", "Quantity" 
), class = "data.frame", row.names = c(NA, -5L)) 
+0

請勿使用圖像來顯示輸入數據。如果DF是顯示的9行,則顯示問題中dput(DF)的輸出並顯示期望的輸出。如果輸出太長,改變你的問題,所以它不會那麼長。閱讀[mcve]。 –

+0

@ G.Grothendieck。感謝您的指導。仍然在學習繩索,但我會確保我未來的帖子和例子更符合預期。 – Udy

+0

@ G.Grothendieck。是的,這在這種情況下會很有用。現在,我只是想用這些數據做出12個月的預測。謝謝! – Udy

回答

0

您可以使用xts對象進行拆分應用組合操作。與動物園不同,xts對象允許重複索引。

# sample data 
Data <- read.csv(text = "MaterialID,Date,Quantity 
1,2011-01-04,13 
1,2011-01-04,5 
1,2011-05-06,9 
1,2011-08-07,3 
1,2011-12-08,10 
2,2011-03-09,4 
3,2011-02-10,7 
3,2011-10-11,78 
3,2014-31-12,32", as.is = TRUE) 
# split data into groups by material id 
dataByMaterialId <- split(Data, Data$MaterialID) 
# create an xts object for each id 
xts_list <- lapply(dataByMaterialId, function(id) { 
    names <- list(NULL, paste0("Qty.", id$MaterialID[1])) 
    xts(id$Quantity, as.Date(id$Date, "%Y-%d-%m"), dimnames = names) 
}) 
# use do.call + merge to combine all your xts objects into one object 
xts_merged <- do.call(merge, c(xts_list, fill = 0)()) 
#   Qty.1 Qty.2 Qty.3 
# 2011-04-01 13  0  0 
# 2011-04-01  5  0  0 
# 2011-06-05  9  0  0 
# 2011-07-08  3  0  0 
# 2011-08-12 10  0  0 
# 2011-09-03  0  4  0 
# 2011-10-02  0  0  7 
# 2011-11-10  0  0 78 
# 2014-12-31  0  0 32 
+0

謝謝Joshua,這正是我所需要的。它工作得很好。祝福你! – Udy

0

我使用expand.grid讓所有的組合,然後使用合併()。我在這裏使用隨機數據

df <- data.frame(materialid = rpois(10, 3), date = as.Date(seq(1, 365 * 4, length.out = 10), origin = '2011-01-01'), quantity = rpois(10, 100)) 

df2 <- expand.grid(unique(df$materialid), as.Date(min(df$date):max(df$date), origin = '1970-01-01')) 
names(df2) <- c('materialid', 'date') 

df2 <- merge(df2, df, by = c('materialid', 'date'), all.x = T) 
df2$quantity[is.na(df2$quantity)] <- 0 
summary(df2) 
+0

謝謝德克。我測試了你的解決方案,並且在填寫空白日期方面做得非常好。但是,約書亞的解決方案以我需要的確切格式給了我最終的輸出。再次感謝。也祝福你! – Udy