在R RasterStack上为每个单元实现which.max()

时间:2012-09-17 02:37:04

标签: r max apply raster which

更新09/17/2012

以下是一段使用自包含数据的代码,可以重现我的问题:

请记住,我的实际数据维度是巨大的......

尺寸:3105,7025,21812625,12(nrow,ncol,ncell,nlayers)

我需要的是每一行的最大索引,col在图层上。所有NA都应该返回NA,并且多个最大copys应该返回第一个最大索引(或其他东西,必须是一致的)

# Create a test RasterStack

require(raster)

a <- raster(matrix(c(11,11,11,
                     NA,11,11,
                     11,11,13),nrow=3))

b <- raster(matrix(c(12,12,12,
                     NA,12,12,
                     40,12,13),nrow=3))

c <- raster(matrix(c(13,9,13,
                     NA,13,13,
                     13,NA,13),nrow=3))

d <- raster(matrix(c(10,10,10,
                     NA,10,10,
                     10,10,10),nrow=3))

corr_max <- raster(matrix(c(13,12,13,
                            NA,13,13,
                            40,12,13),nrow=3))

stack <- stack(a,b,c,d)


which.max2 <- function(x, ...)which.max(x)

# stackApply method
max_v_sApp <- stackApply(stack,rep(1,4),which.max2,na.rm=NULL)

# calc method
max_v_calc <- calc(stack,which.max)

希望这能提供足够的信息。

谢谢! 凯尔

更新:

这可能有效...现在测试:

which.max2 <- function(x, ...){
  max_idx <- which.max(x)   # Get the max
  ifelse(length(max_idx)==0,return(NA),return(max_idx))
}

2 个答案:

答案 0 :(得分:4)

这是对解决方案的猜测。这不是因为which.max没有“支持”na.rm论证只是因为它已经假设它而且只有“有空间”的数据参数。测试从帮助页面获取的小测试用例,但不测试您的数据。您可以使用以下任何一种:

require(raster)
 which.max2 <- function(x, ...) which.max(x)           # helper function to absorb "na.rm"
 wsa <- stackApply(PRISM_stack, rep(1,12), fun=which.max2, na.rm=NULL)

显然这种方法不需要帮助函数去除na.rm:

calc(PRISM_stack, which.max)

对于单元格中所有NA的新问题,无论采用哪种方法,这似乎都成功了:

which.max2 <- function(x, ...) ifelse( length(x) ==sum(is.na(x) ), 0, which.max(x))

就像这样:

which.max2 <- function(x, ...) ifelse( length(x) ==sum(is.na(x) ), NA, which.max(x))

答案 1 :(得分:0)

所以,这是我找到的最后一个问题和我的解决方案。

我遇到的问题是.max()是如何处理所有NA的矢量

>which.max(c(NA,NA,NA))
integer(0)
>

当stackApply()函数尝试将此值写入新的RasterLayer时,它将失败。函数应该返回NA,它返回整数(0),其长度为=。

解决方案(我的解决方案)是为.max()

编写一个包装器
which.max.na <- function(x, ...){
   max_idx <- which.max(x)
   ifelse(length(max_idx)==0,return(NA),return(max_idx))
}

这个,我原来的RasterStack实现工作正常。感谢大家的帮助,如果您有这些解决方案,请提出替代方案!

谢谢! 凯尔