基于循环索引或在r中使用plyr在数据框中创建列序列

时间:2013-10-02 15:41:58

标签: r loops dataframe plyr

我希望创建24小时数据框,其中每个data.frame包含产品的每小时需求为1列,接下来的8列包含每小时温度。例如,对于早上8点的data.framedata.frame将在早上8点包含需求列,然后是8列,用于从最新小时到过去7小时的温度范围。另外的复杂因素是,在早上8点之前的几个小时,即“凌晨4点”,我必须得到昨天的温度。我试着用applyplyr或矢量化函数来弄清楚如何做到这一点,我正撞在墙上。

demand8AM Temp8AM Temp7AM Temp6AM...Temp1AM

Demand4AM Temp4AM Temp3AM Temp2AM Temp1AM Temp12AM Temp11pm(Lag) Temp10pm(Lag) 

在我的代码中,小时是数字; 1是12AM等。

这是我创建的一些简单代码,用于创建我正在处理的数据集。

#Creating some Fake Data
require(plyr)
# setting up some fake data
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$Temperature <- apply(myData, 1, function(x) foo(x[2], x[1]))
myData$Date <-dates

myData$Demand <-(rnorm(1,mean = 0, sd=1)+.75*myData$Temperature )
## ok, done with the fake data generation.

1 个答案:

答案 0 :(得分:0)

看起来你可以从利用时间序列中受益。这是我对你想要的解释(我在rollapply中使用了“均值”函数),而不是你要求的。我建议您阅读xtszoo个包。

#create dummy time vector
time_index <- seq(from = as.POSIXct("2012-05-15 07:00"), 
                  to = as.POSIXct("2012-05-17 18:00"), by = "hour")

#create dummy demand and temp.C
info <- data.frame(demand = sample(1:length(time_index), replace = T), 
                   temp.C = sample (1:10))  

#turn demand + temp.C into time series
eventdata <- xts(info, order.by = time_index)

x2 <- eventdata$temp.C
for (i in 1:8) {x2 <- cbind(x2, lag(eventdata$temp.C, i))}