我的目标是编写一个循环,为一个多元时间序列创建一个唯一的 data.frame,该序列被一个称为小时的因子分割。数据是每天的,并且具有一天中每个小时的需求和广告支出值。每个 data.frame 有 1 个日期列、1 个需求列和 8 个 adspend 列,分别代表当前小时和前 7 个小时的 adspend。例如,I=3 和 I=9 的两个循环周期将产生: 对于上午 9 点 Data.Frame:列将是 Date Demand9AM、AdSpend9AM...AdSpend2AM 对于凌晨 3 点 Data.Frame:列将是 Date Demand3AM、AdSpend3AM ...AdSpend9PM(昨天) 诀窍在于,较早的时间必须从前几天的时间中提取一些广告支出。该站点上的几个可靠的编码人员建议我阅读有关“动物园”软件包的信息。我做到了!所以我已经能够把这个问题带到一个坚实的地方。这是伪数据的代码,它输出与我需要的类似的 data.frames 序列。因为我是新手,我不确定这是创建此循环的最有效方法。所以我的问题是:
有没有更简单的方法来创建这个循环?
有没有办法为循环中的变量分配名称?
- 是否可以以矢量化方式创建数据框?
第一个问题要重要得多。谢谢
set.seed(1)
library(forecast)
library(lubridate)
library(zoo)
library(reshape)
set.seed(31)
foo <- function(myHour, myDate){
rlnorm(1, meanlog=0,sdlog=1)*(myHour) + (150*myDate)
}
Hour <- 1:24
Day <-1:90
dates <-seq(as.Date("2012-01-01"), as.Date("2012-3-30"), by = "day")
myData <- expand.grid( Day, Hour)
names(myData) <- c("Date","Hour")
myData$Adspend <- apply(myData, 1, function(x) foo(x[2], x[1]))
myData$Date <-dates
myData$Demand <-(rnorm(1,mean = 0, sd=1)+.75*myData$Adspend)
## ok, done with the fake data generation.
myData
ADDate<-myData[,-4]
DemDate<-myData[,-3]
HourAD<-melt(ADDate, id=c("Date","Hour"), measured=c("Adspend"))
HourAD<-cast(HourAD,...~Hour)
ADHR<-zoo(HourAD,HourAD$Date)
HourDemand<-melt(DemDate, id=c("Date","Hour"), measured=c("Demand"))
HourDemand<-cast(HourDemand,...~Hour)
DEMHR<-zoo(HourDemand,HourDemand$Date)
DATASET <-vector("list",length(Hour))
for(i in seq_along(Hour)) { ifelse(i==1, DATASET[[i]]<-merge(DEMHR[,1],ADHR[,1],lag(ADHR[,18:24],-1),DATASET[[i]]<-merge(DEMHR[,i],ADHR[,i],DATASET[[i-1]]))}
DATASET <-vector("list",length(Hour))
for(i in seq_along(Hour)) { ifelse(i==1, DATASET[[i]]<-merge(DEMHR[,1],ADHR[,1],lag(ADHR[,18:24],-1)),DATASET[[i]]<-merge(DEMHR[,i],ADHR[,i],DATASET[[i-1]][,2:7]))}