我有一个维度为421,570 x 16的data.table
对象,用于存储多个商店的数据。商店可以有不同的部门。这只是一个例子。数据集更大。
> 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和编程完全是自学成才。
答案 0 :(得分: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')
如果至少有一个Date~Dept~Store组合有多个值,则必须提供一个聚合数据的函数(默认值为length
,并带有警告)。
答案 1 :(得分:0)
您打算做什么样的分析?您可能最好保留原始data.frame并使用ddply
包中的plyr
来执行某些组的操作。我经常将它用于跨各种子集的时间序列分析。请考虑以下示例
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)
})