簡體   English   中英

計算最小值是否小於0?

[英]Compute min for values <0?

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)

我可以使用minmax來獲得s的最小值和最大值

 res=max(s); res=min(s)

我需要的是僅對值> 0取最大值,對僅值<0取最小值。

如果像素的所有值均小於0,則返回NA

我誤解了你的問題,這里是修改后的答案

您可以先編寫一個針對矢量執行此操作的函數

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

(我不確定您如何處理僅具有零值的單元格,因此我不必擔心)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM