我希望创建24小时数据框,其中每个data.frame
包含产品的每小时需求为1列,接下来的8列包含每小时温度。例如,对于早上8点的data.frame
,data.frame
将在早上8点包含需求列,然后是8列,用于从最新小时到过去7小时的温度范围。另外的复杂因素是,在早上8点之前的几个小时,即“凌晨4点”,我必须得到昨天的温度。我试着用apply
或plyr
或矢量化函数来弄清楚如何做到这一点,我正撞在墙上。
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.
答案 0 :(得分:0)
看起来你可以从利用时间序列中受益。这是我对你想要的解释(我在rollapply中使用了“均值”函数),而不是你要求的。我建议您阅读xts
和zoo
个包。
#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))}