通过从for循环中的先前排序的Data.Frame中提取列来创建下一个Data.Frame

时间:2013-10-04 18:01:09

标签: r loops reshape zoo

我的目标是:编写一个循环,为多变量时间序列创建一个唯一的data.frame,该时间序列由一个名为hour的因子分割。数据是每日一次,包含每天每小时的需求和广告支出值。每个data.frame有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。因为我是新手,我不确定这是创建此循环的最有效方法。 所以我的问题是:

  1. 是否有更简单的方法来创建此循环?

  2. 有没有办法为循环中的变量指定名称?

  3. 是否可以以矢量化方式创建数据帧?
  4. 第一个问题更为重要。 谢谢

    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]))}
    

0 个答案:

没有答案