簡體   English   中英

R raster :: calc使用na.rm = FALSE計算分位數

[英]R raster::calc calculating quantile with na.rm = FALSE

我使用raster :: calc計算跨不同層的每個像元的分位數,但是我不理解na.rm = FALSE時的行為,如以下示例所示。

讓我們創建一個示例柵格,並從隨機像元中刪除5個值。

library(raster)

r <- raster::raster(nrow = 2, ncol = 2)
r[] <- 1:4

s <- raster::stack(r, r*2, r * 3, r * 4, r * 5)
s[]

set.seed(1)
s[][sample(1:4, 1), sample(1:5, 1)] <- NA
s[][sample(1:4, 1), sample(1:5, 1)] <- NA
s[][sample(1:4, 1), sample(1:5, 1)] <- NA
s[][sample(1:4, 1), sample(1:5, 1)] <- NA
s[][sample(1:4, 1), sample(1:5, 1)] <- NA
s[]

如果刪除NA,則以下代碼有效!

fun <- function(x) {quantile(x, probs = 0.50, na.rm = TRUE)}
p <- raster::calc(s, fun)
p[]

但是,如果要排除至少有一個不適用的單元格,則該代碼將無法正常工作!

fun <- function(x) {quantile(x, probs = 0.50, na.rm = FALSE)}
p <- raster::calc(s, fun)

我期待一個包含4個NA的向量,但是上面的代碼卻拋出此錯誤:

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

有人可以幫我理解為什么會這樣嗎? 我應該怎么做才能得到我期望的行為?

我認為該錯誤消息很直接,並且可能與柵格數據包無關。 基本思想是,如果將quantile函數應用於具有任何NA值,則quantile函數將返回錯誤消息。

考慮以下示例。

# Set na.rm = TRUE
quantile(c(1, NA, 3, 4), probs = 0.50, na.rm = TRUE)

50% 
  3

# Set na.rm = FALSE
quantile(c(1, NA, 3, 4), probs = 0.50, na.rm = FALSE)

Error in quantile.default(c(1, NA, 3, 4), probs = 0.5, na.rm = FALSE) :
   missing values and NaN's not allowed if 'na.rm' is FALSE

當設置na.rm = FALSE ,第二個示例僅返回錯誤。 quantile應用於柵格時,這是相同的。 na.rm必須為TRUE。

更新

為了說明當某些單元格為NA時如何應用分位數功能,我對OP中的示例數據集做了一些修改。

s <- raster::stack(r, r*2, r * 3, r * 4, r * 5)
s[]

set.seed(1)
s[][sample(1:4, 1), sample(1:5, 1)] <- NA
s[][sample(1:4, 1), sample(1:5, 1)] <- NA
s[][sample(1:4, 1), sample(1:5, 1)] <- NA
s[]

     layer.1 layer.2 layer.3 layer.4 layer.5
[1,]       1       2       3       4      NA
[2,]       2      NA       6       8      10
[3,]       3       6       9      12      NA
[4,]       4       8      12      16      20

請參閱最后一行,該行沒有任何NA

然后,我們可以創建一個函數。 如果某個位置的任何層都有任何NA ,則此函數將返回NA 否則,它將計算分位數。

# Design a function
quantile_fun <- function(x, probs = 0.50){
  if (anyNA(x)){
    return(NA)
  } else {
    return(quantile(x, probs = probs))
  }
}

之后,我們可以使用calc應用此功能

p <- raster::calc(s, quantile_fun) 
p[]
[1] NA NA NA 12

暫無
暫無

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

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