作为学习plyr的练习,我试图对Rob Hyndman最近发布的一篇文章做一个plyr版本:
library(forecast); library(plyr)
# Hyndman, R. J. (2013, Jan 7). Batch forecasting in R
# Retrieved Jan 8, 2013, from Research Tips: http://robjhyndman.com/researchtips/batch-forecasting/
retail <- read.csv("http://robjhyndman.com/data/ausretail.csv",header=FALSE)
retail <- ts(retail[,-1],f=12,s=1982+3/12)
ns <- ncol(retail)
h <- 24
fcast <- matrix(NA,nrow=h,ncol=ns)
for(i in 1:ns)
fcast[,i] <- forecast(retail[,i],h=h)$mean
write(t(fcast),file="retailfcasts.csv",sep=",",ncol=ncol(fcast))
但是,我一直在努力。这是我的尝试:
n.cols <- ncol(retail)
h <- 24
series.names <- names(retail[,2:n.cols])
fcast.func <- function(retail) {
retail.ts <- ts(retail,f=12,s=1982+3/12)
fcast.func <- forecast(retail.ts,h=h)$mean
}
ddply.fcast <- ddply(.data=retail[,2:n.cols], .variables=series.names, .fun=colwise(fcast.func))
不返回任何值。有人可以帮助我解决我对plyr的误解吗?
答案 0 :(得分:4)
问题是您使用ddply(
,其中第一个d = datatype of input = data.frame
和第二个d = datatype of output = data.frame (again)
。但是,您提供的输入retail[, 2:ncols]
不是data.frame
。
class(retail)
[1] "mts" "ts"
相反,你可以做的是ldply
,它以list
作为输入,运行你的函数并尝试输出data.frame
。你可以用这种方式完成。
require(forecast)
require(plyr)
retail <- read.csv("http://robjhyndman.com/data/ausretail.csv",header=FALSE)
retail <- ts(retail[,-1],f=12,s=1982+3/12)
ns <- ncol(retail)
h <- 24
plyr.fcast <- t(ldply(1:ns, function(idx) {
c(forecast(retail[, idx], h = h)$mean)
}))
这需要花费很多时间。如果要并行运行(假设您在具有多个内核的群集/计算机上运行),则可以安装程序包doMC
,然后按如下方式使用它:
require(doMC)
registerDoMC(20) # BEWARE: use it if you have 20 processors available!!
plyr.fcast <- t(ldply(1:ns, function(idx) {
c(forecast(retail[, idx], h = h)$mean)
}, .parallel = TRUE))
转置设置的结果等于fcast
,并且还会将data.frame
的{{1}}输出类型转换为plyr
。因此,您可以使用相同的matrix
语法写入文件。
希望这有帮助。