计算栅格砖的按单元百分位数的最快方法[R]

时间:2019-05-02 15:25:42

标签: r loops statistics raster

我想为栅格砖的每个像元(+50层,70,000,000个像元)计算一些统计数据,例如中位数。这小段代码正在运行,但是速度却非常慢...:

    r <- raster(ncol=3000, nrow=2000)
    r[] <- rnorm(n=ncell(r))
    s <- stack(x=c(r, r*2, r))
    file <- brick(x=c(r, r*2, r))
    q25 <- file[[1]]
    i=0
    for(i in 1:ncell(file)){
      progress(i, max.value = ncell(file))
      q25[i] <- unname(quantile(file[i],.5,na.rm=TRUE))
    }

q25是一个栅格图层(与“文件”完全相同),但只有一个图层(不是砖)。

我很乐意提出任何加快速度的建议。

谢谢!

2 个答案:

答案 0 :(得分:2)

避免循环循环,因为它太慢了。

示例数据

library(raster)
r <- raster(ncol=300, nrow=200)
set.seed(1)
values(r) <- rnorm(n=ncell(r))
s <- stack(r, r*2, r)

您的方法

q25 <- raster(s)
for(i in 1:ncell(q25)){
   q25[i] <- quantile(s[i], .5, na.rm=TRUE)
}

更好的方法(快10倍,见下文)

q1 <- calc(s, fun=function(x) quantile(x, .5, na.rm=TRUE))

但对于中位数,使用速度更快(〜37倍)

q2 <- calc(s, fun=function(x)median(x, na.rm=TRUE))

速度比较:

system.time(for(i in 1:ncell(q25)){ q25[i] <- quantile(s[i], .5, na.rm=TRUE)  })
#user  system elapsed 
#69.24   13.90   83.71 
system.time( q1 <- calc(s, fun=function(x)quantile(x, .5, na.rm=TRUE)))
#user  system elapsed 
#7.81    0.00    7.81 
system.time(q2 <- calc(s, fun=function(x)median(x, na.rm=TRUE)))
#user  system elapsed 
#2.23    0.00    2.23 

答案 1 :(得分:0)

您可以通过并行运行上面的calc函数来加快处理速度。此链接包含有关操作方法的一些信息。祝好运... https://www.gis-blog.com/increasing-the-speed-of-raster-processing-with-r-part-33-cluster/