我需要从 1303 个栅格中获取数据(每个栅格包含 1 个月的数据),并为栅格中的每个网格单元创建一个时间序列。最后,我将把所有时间序列加入到一个巨大的(zoo)文件中。
我有可以做到这一点的代码(我尝试了数据集的一小部分并且它有效),但似乎只需要堆叠栅格就需要永远(现在超过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=",")
}
最佳答案
第一位可以简单地是:
s <- stack(files)
创建堆栈有点慢的原因是每个文件都需要打开并检查它是否具有与其他文件相同的 nrow、ncol 等。如果您绝对确定是这种情况,您可以使用这样的快捷方式(通常不推荐)
quickStack <- function(f) {
r <- raster(f[1])
ln <- extension(basename(f), '')
s <- stack(r)
s@layers <- sapply(1:length(f), function(x){ r@file@name = f[x]; r@layernames=ln[x]; r@data@haveminmax=FALSE ; r })
s@layernames <- ln
s
}
quickStack(files)
您或许还可以加快第二部分的速度,如下面的示例所示,具体取决于您拥有多少 RAM。
逐行读取:
for (lat in 1:360) {
pet <- getValues(s, lat, 1)
for (long in 1:720) {
x <- xts(pet[long,], dat)
write.zoo(x,file=paste("P:/WRSRL/Users1/ncgk/IBERIA/cru_pet/zoo/","lat",lat,"long",long,".csv", sep="") , sep=",")
}
}
更极端的是,一次性读取所有值:
pet <- getValues(s)
for (lat in 1:360) {
for (long in 1:720) {
cell <- (lat-1) * 720 + long
x <- xts(pet[cell,], dat)
write.zoo(x,file=paste("P:/WRSRL/Users1/ncgk/IBERIA/cru_pet/zoo/","lat",lat,"long",long,".csv", sep="") , sep=",")
}
}
关于performance - 提高性能/速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9929324/