我需要从1303栅格(每个栅格有1个月的数据)中获取数据,并为栅格中的每个栅格单元创建一个时间序列。最后,我会将所有时间序列合并成一个大型(动物园)文件。提高性能/速度
我有代码可以做到这一点(我尝试了一小部分数据集,它的工作原理),但它似乎只是堆叠栅格(现在超过2小时,仍然在计数)和这不是较慢的部分,这将是时间序列。所以这里是我的代码,如果有人知道更快的方式来堆叠栅格和/或创建时间序列(也许没有双循环?)请帮助...
我不知道任何其他编程语言,但这对R来说太过分了吗?
files <- list.files(pattern=".asc")
pat <- "^.*pet_([0-9]{1,})_([0-9]{1,}).asc$"
ord_files <- as.Date(gsub(pat, sprintf("%s-%s-01", "\\1", "\\2"), files))
files<-files[order(ord_files)]
#using "raster" package to import data
s<- raster(files[1])
pet<-vector()
for (i in 2:length(files))
{
r<- raster(files[i])
s <- stack(s, r)
}
#creating a data vector
beginning = as.Date("1901-01-01")
full <- seq(beginning, by='1 month', length=length(files))
dat<-as.yearmon(full)
#building the time series
for (lat in 1:360)
for (long in 1:720)
{
pet<-as.vector(s[lat,long])
x <- xts(pet, dat)
write.zoo(x,file=paste("P:/WRSRL/Users1/ncgk/IBERIA/cru_pet/zoo/","lat",lat,"long",long,".csv", sep="") , sep=",")
}
的问题是,这部分的代码需要多少时间。最后一个双循环将执行360 * 720次,这是很多。如果你有多个CPU,你可以并行运行(看看foreach)。 – smu 2012-03-29 17:19:08
我仍在努力导入所有的文件,我认为在阅读了几篇文章之后,光栅包是最好的选择,但我不确定它是否适用于1303文件。但'read.table'更糟! – sbg 2012-03-29 17:31:45
然后问题可能如下:对于每次迭代R需要分配一个新的对象S与增加的大小。这种分配会花费很多时间。在循环之前分配s可能会更快。我给你一个简单的例子: 你的方式: 's = c()'; (1:10){s < - c(s,rnorm(100))}' 更快: 's = rep(NA,1000)'; '(我在seq(1,10 * 100,100)){s [i:(i + 99)] - rnorm(100)}'(对不起,这看起来很难看) – smu 2012-03-29 17:40:13