2014-04-28 254 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) 
     })