更新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))
}
答案 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实现工作正常。感谢大家的帮助,如果您有这些解决方案,请提出替代方案!
谢谢! 凯尔