栅格计算功能 - NA数据的问题

时间:2014-05-25 05:43:14

标签: r function raster

我正在尝试在两个栅格之间应用相对简单的“栅格数学”计算。我似乎无法弄清楚如何在我的函数中正确设置NA值。我到处寻找答案,尝试了几种不同的方法来解决这个问题,但无济于事。

library(raster)

#Edited with feedback
fun.calc <- function(x, y, ...)
{
tree.w <- sum(x / (100 - y), ...)
ifelse(is.na(x) | is.na(y), NA, tree.w)
}

r1 <- raster(nrow=50, ncol = 50)
r1[] <- 90
r1[4:10,] <- NA
r2 <- raster(nrow=50, ncol = 50)
r2[] <- 40
r2[9:15,] <- NA

#Try UPDATED
fun.calc(r1[,,1], r2[,,1], fun=fun.calc, na.rm=TRUE)

这不会引发错误,但是我没有得到正确的值,在没有NA值的地方应该是1.5(我得到2850)。我不明白为什么这样做,但我想它与光栅中的矢量有关。

感谢您的想法!

2 个答案:

答案 0 :(得分:1)

马上就可以了,我可以告诉你fun.calc1应该重写为我下面的内容。你有太多的return语句,实际上你根本就不需要它们。您也没有将...参数传递给函数。如果您希望na.rm = TRUE返回NAx,我也不明白为什么您需要y

fun.calc1 <- function(x, y, ...)
{
     tree.w <- sum(x / (100 - y), ...)
     ifelse(is.na(x) | is.na(y), NA, tree.w)
}

屈服

> fun.calc1(5, 10)
# [1] 0.05555556
> fun.calc1(5, NA, na.rm = TRUE)
# [1] NA

相同
fun.calc3 <- function(x, y)  sum(x / (100 - y))

> fun.calc1(5, 10)
# [1] 0.05555556    
> fun.calc3(5, NA)
# [1] NA

答案 1 :(得分:0)

似乎我必须这样才能得到这个答案的解决方案。我真的不明白为什么除了这似乎有效。如果有人有更好的答案,那就太好了。

fun.calc1 <- function(x, y, ...)
{
tree.w <- sum(x / (100 - y), ...)
length.xy <- length(which(!is.na(x) & !is.na(y)))
ifelse(is.na(x) | is.na(y), NA, tree.w/length.xy)
}

fun.calc1(r1[1:length(r1)],r2[1:length(r2)], na.rm=T)

同样,不确定为什么会有效,但我确实得到1.5的正确答案。