将变量合并为统一的时间序列

时间:2018-03-19 00:04:37

标签: r time-series

我的数据按以下方式组织:

product  week1  ...   week52   year    release
A        NA     ...   100      2008    2008-06-06
B        200    ...   200      2008    2008-01-01 
...      ...    ...   ...      ...     ...
A        60     ...   50       2009    2008-06-06

其中product是指产品标识符,week1week52是一年中的每周销售额,year是当前年份,release是发布日期。

我想结合并“转动”年和周来创建一个像这样的新数据集:

product  date        released  sales
A        2008-01-07  0         NA       
...      ...         ...       ...
A        2008-12-31  1         100
A        2009-01-07  1         60
...      ...         ...       ...
A        2009-12-31  1         50
B        2008-01-07  1         200
...      ...         ...       ...
B        2008-12-31  1         200

现在,而不是week_iyear,我们为每个产品都有一个时间序列变量,而released是一个假人,无论产品是否已在任何时间点发布

我的问题是:考虑到数据中多年来我有数以万计的产品,我怎么能以计算效率的方式做到这一点?不要担心实际的日历年超过52周,只要考虑一年中的最后一周会延长以吸收剩余的几天。

我可以创建一个新的面板数据框,其中包含产品ID和左侧所需的时间序列,然后编写一个三级循环,依次遍历所有产品,所有年份和所有周。例如,以下是获取sales的最内层循环的概念,包含数据框olddatanewdata,并假设两个外部循环当前指向产品{{1} }和年P

Y

其中temp=newdata[which(newdata$product==P & year(newdata$date)==Y),] for (i in (1:52)) { temp[i,4]=olddata[which(olddata$product==P & olddata$year==Y),1+i] } 提供年度提取。

然而,这可能是非常低效的计算低谷。 你有更直截了当的建议吗?

提前致谢!

编辑:这里有一些代码可以生成像我无法分享的数据一样的组织样本:

lubridate

1 个答案:

答案 0 :(得分:0)

好的,这是我发现的最简单的方法。但它仍然需要一个循环;输入速度慢但不太麻烦。

首先按产品ID对数据进行排序:

mydata=mydata[order(mydata$product, mydata$year),]

product  week1  ...   week52   year    release
A        NA     ...   100      2008    2008-06-06
A        60     ...   50       2009    2008-06-06
B        200    ...   200      2008    2008-01-01 

然后注意通过转置您获得的每周销售数据矩阵(显示产品A的观察结果):

t(mydata[which(mydata$product=="A"),2:53])

week1  NA   60
...    ...  ...
week52 100  50

第一列对应于2008年,第二列对应于2009年。 因此,通过对此矩阵进行矢量化,您将获得一列每周数据:

c(t(mydata[which(mydata$product=="A"),2:53]))

week1   NA
...     ... 
week52  100
week1   60
...     ...
week52  50

我们希望为每种产品获得哪些产品。结果循环表示newdata“堆叠”数据帧:

# List all unique products
products=unique(mydata$product)
N=length(products)
for (i in (1:N)) {
 # Replace values in the vector of "stacked up" sales:
 newdata$sales[which(newdata$product==products[i])]=c(t(mydata[which(mydata$product==products[i]),2:53]))
}

此循环需要一段时间才能运行,但不需要太多的用户算术,因此人为错误的风险并不高。