Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R光栅::calc计算分位数,na.rm=FALSE_R_Na_R Raster_Quantile - Fatal编程技术网

R光栅::calc计算分位数,na.rm=FALSE

R光栅::calc计算分位数,na.rm=FALSE,r,na,r-raster,quantile,R,Na,R Raster,Quantile,我使用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), s

我使用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
的值,
分位数
函数将返回错误消息

考虑下面的例子

# 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
时,第二个示例刚刚返回了一个错误。这与将分位数应用于光栅时相同
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
之后,我们可以使用
calc

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

p谢谢@ycw!您将如何编写一个函数来实现我期望的行为?@Claudia感谢您的反馈。请看我的更新。
# 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
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
# Design a function
quantile_fun <- function(x, probs = 0.50){
  if (anyNA(x)){
    return(NA)
  } else {
    return(quantile(x, probs = probs))
  }
}
p <- raster::calc(s, quantile_fun) 
p[]
[1] NA NA NA 12