栅格计算功能,用于查找最大索引(即最近一层)会议标准

时间:2018-04-14 04:30:47

标签: r raster r-raster

对于rasterStack的每个单元格,我想找到值超过固定阈值的最新图层。图层按时间顺序堆叠,因此这对应于最大索引。最后我想知道1)该层的年份(取自图层名称),以及2)该年的值。

我写了一个函数来做这个并且得到了错误的结果。我以一种我认为不会改变它的方式修改了这个功能;我现在得到了正确的结果。我的问题是为什么这些函数会产生不同的东西。

设置示例:

library(raster)
library(rasterVis)

###   Example raster stack: 
set.seed(123123)
r1 <- raster(nrows = 10, ncols = 10)
r2 <- r3 <- r4 <- r1
r1[] <- rbinom(ncell(r1), 1, prob = .1)
r2[] <- rbinom(ncell(r1), 1, prob = .1)
r3[] <- rbinom(ncell(r1), 1, prob = .1)
r4[] <- rbinom(ncell(r1), 1, prob = .1)
rs <- stack(r1, r2, r3, r4)
names(rs) <- paste0("yr", 1:4)

这些是我原本认为会相同的功能......有没有理由不将矢量作为中间步骤?

###  Function to find index of last event:
# v1; this is wrong
findLast <- function(x) {
  fire.ind <- ifelse(any(x > 0), which(x > 0), NA)
  max.ind <- max(fire.ind)
}

# v2; this one gives correct answer
findLast2 <- function(x) {
  max.ind <- ifelse(any(x > 0), max(which(x > 0)), NA)
}

testFind <- calc(rs, findLast)
freq(testFind)

testFind2 <- calc(rs, findLast2)
all.equal(testFind, testFind2)

显示示例输入和不同的结果:

# plot:
s2 = stack(rs, testFind, testFind2)
levelplot(s2, pretty = TRUE)

inputs and difference in outputs between functions

获取我想要的最终图层的代码:

###  Most recent year:
nameFromInd <- function(x) {
  yr <- as.integer(gsub(".*(\\d.*).*", "\\1", names(rs)[x]))
}
testYr <- calc(testFind2, nameFromInd)

###  Value in most recent year:
testYrValue <- stackSelect(rs, testFind2)

对我在这里看不到的内容有任何见解?我没有玩过提高速度的替代方案,但欢迎提出任何建议,因为我将在非常大的数据集上进行此操作。

sessionInfo()
R version 3.2.4 Revised (2016-03-16 r70336)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

1 个答案:

答案 0 :(得分:0)

ifelse可能有点令人惊讶,因为它返回一个具有相同&#34;形状的值#34;作为第一个参数,长度为1。因此它仅返回which(x > 0)结果的第一个值。在使用calc之前,请务必检查您使用的功能。

x <- c(-1:2, 1:-1)
ifelse(any(x > 0), which(x > 0), NA)
#[1] 3
ifelse(any(x > 0), max(which(x > 0)), NA)
#[1] 5

ifelse是一个非常复杂的功能,我认为你可以通过这样做来避免它:

r <- calc(rs, function(x) max(which(x > 0)))
y <- stackSelect(rs, r)

(并忽略警告)。或压制他们:

options(warn=-1)
r <- calc(rs, function(x) max(which(x > 0)))
options(warn=0)
testYrValue <- stackSelect(rs, r)

您还可以将对calcstackSelect这样做的内容与

相结合
f1 <- function(x) {
    if (any(x>0)) {
        i <- max(which(x > 0))
        cbind(i, x[i])
    } else {
        cbind(NA, NA)
    }
}

rr1 <- calc(rs, f1)

或快捷方式变种:

f2 <- function(x) {
    i <- max(which(x > 0))
    cbind(i, x[i])
}

rr2 <- calc(rs, f2)

f3 <- function(x) {
    i <- max(which(x > 0))
    z <- cbind(i, x[i])
    z[!is.finite(z)] <- NA
    z
}

rr3 <- calc(rs, f3)