【问题标题】:Floor values in raster stack cell to certain quantile of cell values r栅格堆栈像元中的底值到像元值 r 的某个分位数
【发布时间】:2018-11-08 12:47:03
【问题描述】:

我正在努力解决栅格堆栈的地板单元值问题。这里有一些示例数据:

library(raster)

r <- raster(ncol=10, nrow=10)
s <- stack(lapply(1:365, function(i) setValues(r, runif(100, 0, 1))))
# adding NAs
s[[2]][sample(100, 25, TRUE)] <- NA
s[sample(100, 25, TRUE)] <- NA

我有一整年的时间序列栅格堆栈。一些单元格完全设置为 NA 以及时间序列中的一些单个值。 我正在尝试将每个单元格中的值降低到单元格的下 0.025 分位数。这就是我的功能所取得的进展:

f <- function(i) {
  v_q <- quantile(i,probs = .025 ,na.rm=TRUE)
  if (length(v_q) > 0) {
    if(i[v_q] < v_q) {
      i[v_q] <- v_q
    }
    i
  }
  i  
}

x <- calc(s, fun = f)

当我将它应用于calc 时,我不断收到以下错误:

Error in .calcTest(x[1:5], fun, na.rm, forcefun, forceapply) : 
  cannot use this function

有什么想法吗?

【问题讨论】:

    标签: r stack raster


    【解决方案1】:

    不确定错误,但你的函数看起来有点奇怪。

    首先,让我们添加一个随机种子以实现重现性:

    library(raster)
    
    r <- raster(ncol=10, nrow=10)
    set.seed(42)
    s <- stack(lapply(1:365, function(i) setValues(r, runif(100, 0, 1))))
    # adding NAs
    s[[2]][sample(100, 25, TRUE)] <- NA
    s[sample(100, 25, TRUE)] <- NA
    

    calc 在堆栈或砖块上基本上适用于跨层的值向量。

    所以这应该有效:

    f <- function(i) {
      q <- quantile(i,probs = .025 ,na.rm=TRUE)
    
      i[i<q] <- q
      i
    
    }
    
    x <- calc(s,fun=f)
    

    然后进行测试:

    q <- calc(s,fun = function(x) quantile(x,0.025,na.rm=T))
    
    par(mfrow=c(1,2))
    
    plot(s[[1]] < q,main="s[[1]] < q")
    plot(x[[1]] == q,main="x[[1]] == q")
    

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 2016-05-22
      • 2021-12-11
      • 2019-02-21
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多