我的数据按以下方式组织:
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
是指产品标识符,week1
到week52
是一年中的每周销售额,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_i
和year
,我们为每个产品都有一个时间序列变量,而released
是一个假人,无论产品是否已在任何时间点发布
我的问题是:考虑到数据中多年来我有数以万计的产品,我怎么能以计算效率的方式做到这一点?不要担心实际的日历年超过52周,只要考虑一年中的最后一周会延长以吸收剩余的几天。
我可以创建一个新的面板数据框,其中包含产品ID和左侧所需的时间序列,然后编写一个三级循环,依次遍历所有产品,所有年份和所有周。例如,以下是获取sales
的最内层循环的概念,包含数据框olddata
和newdata
,并假设两个外部循环当前指向产品{{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
答案 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]))
}
此循环需要一段时间才能运行,但不需要太多的用户算术,因此人为错误的风险并不高。