library(raster)
r1 <- r2 <- r3 <- raster(ncol=10, nrow=10)
r1[] <- runif(ncell(r1))
r2[] <- runif(ncell(r2)) / 2
r3[] <- runif(ncell(r3)) * 1.5
s <- stack(r1, r2, r3)
我可以使用min
和max
来获取s的最小值和最大值
res=max(s); res=min(s)
我需要的是仅将值> 0作为最大值 和最小值仅表示<0。
如果像素的所有值均<0,则返回NA
答案 0 :(得分:1)
我误解了你的问题,这是修改后的答案
您可以首先编写一个针对矢量执行此操作的函数
f <- function(x) {
s <- sign(x)
if (all(is.na(s))) return( c(NA, NA))
if (all(s == -1)) return( c(NA, NA))
mn <- min(x[which(s==-1)])
mx <- max(x[which(s==1)])
r <- c(mn, mx)
r[!is.finite(r)] <- NA
r
}
并测试
a <- c(5,-1,2)
b <- c(-5,-1,-2)
f(a)
#[1] -1 5
f(b)
#[1] NA NA
f(c(NA, NA, NA))
#[1] NA NA
f(c(0, 0, 0))
#[1] NA NA
有些警告可以忽略(或关闭) 现在,有了栅格数据:
library(raster)
r1 <- r2 <- r3 <- raster(ncol=10, nrow=10)
set.seed(1)
values(r1) <- runif(ncell(r1), -1, 1)
values(r2) <- runif(ncell(r2), -1, 1) / 2
values(r3) <- runif(ncell(r3), -1, 1) * 1.5
s <- stack(r1, r2, r3)
x <- calc(s, f)
x
#class : RasterBrick
#dimensions : 10, 10, 100, 2 (nrow, ncol, ncell, nlayers)
#resolution : 36, 18 (x, y)
#extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
#data source : in memory
#names : layer.1, layer.2
#min values : -1.3561226050, 0.0004409726
#max values : -0.04476076, 1.44469038
或者使用栅格代数,如下所示:
pos <- reclassify(s, cbind(-Inf, 0, NA))
neg <- reclassify(s, cbind(0, Inf, NA))
xp <- max(pos, na.rm=TRUE)
nn <- min(neg, na.rm=TRUE)
nn <- mask(nn, xp)
r <- stack(nn, xp)
r
(我不确定您如何处理只有零值的单元格,所以我不必担心)