计算多个栅格层中每个像素的分位数 probs 0.05

如何解决计算多个栅格层中每个像素的分位数 probs 0.05

我想计算多个层中每个像素的分位数

library(raster)

r <- raster(ncols=36,nrows=18)
r[] <- 1:ncell(r)
s <- stack(r,r*2,sqrt(r))
s[10:20] <- NA

beginCluster()
clusterR(s,calc,args=list(fun = quantile,na.rm= TRUE,prob = c(0.05,0.5,0.95)))
endCluster()

我希望有三层,但它会产生认的概率(参见 stats::quantile())

我还尝试使用特定参数生成函数分位数,如

function(x){quantile(x,probs = c(0.05,0.95)}

但出现以下错误

Error in is.infinite(v) : default method not implemented for type 'list'

解决方法

我在玩,没想到这么简单

library(raster)

r <- raster(ncols=36,nrows=18)
r[] <- 1:ncell(r)
s <- stack(r,r*2,sqrt(r))
s[10:20] <- NA

q95 <- function(x){
  if(is.na(x)){
    NA
  }else{
    stats::quantile(x,.95)
  }
}

beginCluster()
clusterR(r,calc,args=list(fun = q95),verbose=TRUE)
endCluster()

然后我重复了 prob = 0.05

,

terra 包具有 quantileSpatRaster 方法。

library(terra)
rr <- rast(ncols=36,nrows=18)
values(rr) <- 1:ncell(rr)
ss <- c(rr,rr*2,sqrt(rr))
ss[10:20] <- NA

q <- quantile(ss,c(0.05,0.5,0.95))
q
#class       : SpatRaster 
#dimensions  : 18,36,3  (nrow,ncol,nlyr)
#resolution  : 10,10  (x,y)
#extent      : -180,180,-90,90  (xmin,xmax,ymin,ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +no_defs 
#source      : memory 
#names       :      q0.05,q0.5,q0.95 
#min values  :        1.0,1.0,1.9 
#max values  :   87.71026,648.00000,1231.20000 

这应该比 raster 更快;但是你可以像这样使用raster

得到相同的结果
library(raster)
r <- raster(ncols=36,nrows=18)
values(r) <- 1:ncell(r)
s <- stack(r,sqrt(r))
s[10:20] <- NA

# improved version of your function
qfun <- function(x){
  if(is.na(x)){
    c(NA,NA,NA)
  }else{
    quantile(x,.95))
  }
}

z <- calc(s,qfun)

但我会这样做:

qf <- function(x){
    quantile(x,.95),na.rm=TRUE)
}
z <- calc(s,qf)

z
#class      : RasterBrick 
#dimensions : 18,648,ncell,nlayers)
#resolution : 10,y)
#extent     : -180,ymax)
#crs        : +proj=longlat +datum=WGS84 +no_defs 
#source     : memory
#names      :        X5.,X50.,X95. 
#min values :        1.0,1.9 
#max values :   87.71026,1231.20000 

您可以对 terra::app 使用相同的函数。

zz <- app(ss,qf)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?