2014-04-28 436 views
0

我有一個data.table尺寸爲421,570 x 16的對象,它存儲多個商店的數據。商店可以有不同的部門。這僅僅是一個例子。數據集較大。使用reshape2填充數組

> head(raw.df) 
    Store Type StoreSize Dept  Date Weekly_Sales 
1:  1 A 151315 1 2010-02-05  24925 
2:  1 A 151315 2 2010-02-05  46039 
3:  2 A 152825 1 2010-02-05  41596 
4:  2 A 152825 2 2010-02-05  19404 
5:  3 B 110025 1 2010-02-05  21828 
6:  3 B 110025 2 2010-02-05  21043 

理想情況下,我想創建一個數組對象,它可以存儲多個矩陣,每個矩陣上我想有一個存儲。基本上,我希望每個部門的每個級別都有每個部門的每週銷售額,這樣我就可以對數組對象運行一些時間序列分析,而無需多次運行相同的功能。

這條命令會產生我想要的數組的一種矩陣。

dcast(raw.df[which(raw.df$Store == 1), ], Date ~ Dept, value.var = "Weekly_Sales") 
head(e1) 

我正在考慮生成一個空數組,並使用for loop填充它。我寫了這個循環,很遺憾不起作用。 陣列的尺寸爲143(天),99(部門爲每個商店),45(店)

ts.a <- array(data = NA, dim = c(143, 99, 45)) 
for (i in 1:45) { 
    # generate 45 matrices, one for each store 
    paste("mat", i, sep = "") <- matrix(data = NA, nrow = 143, ncol = 99) 
    paste("mat", i, sep = "") <- dcast(raw.df[which(raw.df$Store == i), ], Date ~ Dept, 
            value.var = "Weekly_Sales") 

    # merge the matrix into the array object  
} 

我知道我的做法可能是完全錯誤的。我的知識或R和編程是完全自學的。

+1

這是有點不清楚,爲什麼你似乎認爲三維數組將是最有效的方式來存儲這些數據。你能詳細說明一下嗎? – joran

+1

爲什麼不告訴我們你的實際問題是什麼,而不是要求你的問題的具體解決方案?對於這種類型的分析(對多組數據應用類似的計算),data.table是非常通用的。 – BrodieG

+1

我同意以前的評論,並且還將'?xtabs'作爲未來的實用工具;例如'xtabs(Weekly_Sales〜Date + Dept + Store,DF)' –

回答

0

既然你沒有提供易於使用的數據,我將使用隨reshape2的french_fries數據集:

str(french_fries) 
acast(data=french_fries, time~treatment~subject, value.var='potato', fun.aggregate=mean) 

其中給出時間VRS的arrray。治療,爲每個科目分一杯羹。

因此,與您的數據相當於將是這樣的:

acast(data=raw_df, Date~Dept~Store, value.var='potato') 

如果您有至少一個日期多個值〜部門〜店組合,你將不得不提供彙總數據的函數(默認爲length,並帶有警告)。

0

你想要做什麼樣的分析?保留原始數據幀並使用plyr包中的ddply執行某些組的操作可能會更好。我經常使用它來進行各種子集的時間序列分析。考慮下面的例子,

dat<-data.frame(store=sample(1:3, 1000, T), 
       type=sample(1:3, 1000, T), 
       date=sample(1:100, 1000, T), 
       val=rnorm(1000)) 
ddply(dat, .(store, type), # we can run a regression for our subgroups 
     function(x){ 
     model<-lm(date ~ val, data=x) 
     c(cf=coef(model), num=nrow(x), adjr2=summary(model)$adj.r.squared) 
     })