对于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)
获取我想要的最终图层的代码:
### 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)
答案 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)
您还可以将对calc
和stackSelect
这样做的内容与
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)