【问题标题】:Populate an array using reshape2使用 reshape2 填充数组
【发布时间】:2014-04-28 21:19:12
【问题描述】:

我有一个尺寸为 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 和编程完全是自学的。

【问题讨论】:

  • 我有点不清楚为什么您似乎认为 3 维数组将是存储这些数据的最有效方式。你能详细说明一下吗?
  • 与其要求特定的解决方案来解决您的问题,不如告诉我们您的实际问题是什么? data.table 非常适合这种类型的分析(对多组数据应用类似的计算)。
  • 我同意之前的 cmets,并且,将 ?xtabs 视为未来的实用程序;例如xtabs(Weekly_Sales ~ Date + Dept + Store, DF)

标签: arrays r reshape2


【解决方案1】:

由于您没有提供易于使用的数据,我将使用 reshape2 附带的 french_fries 数据集:

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

这给出了一系列时间vrs。治疗,每个受试者切片。

因此,与您的数据等效的是:

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

如果您对至少一个 Date~Dept~Store 组合有多个值,则必须提供一个函数来聚合数据(默认为 length,带有警告)。

【讨论】:

    【解决方案2】:

    您希望进行什么样的分析?您最好保留原始 data.frame 并使用 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)
          })
    

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多