【问题标题】:stackApply with multivariate function in R在 R 中使用多变量函数的 stackApply
【发布时间】:2016-07-16 12:01:26
【问题描述】:

我希望在 raster 包中使用 stackApply() 并使用 approx() 在一堆栅格之间线性插值一个栅格的网格单元。我已经编写了一个类似的函数,它在数据帧上执行此计算,但想在栅格堆栈而不是数据帧中的行上执行此计算。我已经找到了将 stackApply() 与用户定义的函数一起使用的先前示例,但没有一个涉及多个变量。

换句话说,我有一堆栅格和一个单独的栅格网格(它们具有匹配的范围和分辨率)。我想逐个单元格地“钻取”堆栈,以创建一个值向量,并使用堆栈创建的向量线性插值孤立栅格中匹配网格单元格的值。

我的代码是...

require(raster)
set.seed(42) 
x1 <- runif(100) 
x2 <- x1 
x3 <- x1 
x1[sample(1:100, 30)] <- NA 
x2[sample(1:100, 30)] <- NA 
x3[sample(1:100, 30)] <- NA 
r1 <- raster(matrix(x1, nrow=10, ncol=10)) 
r2 <- raster(matrix(x2, nrow=10, ncol=10)) 
r3 <- raster(matrix(x3, nrow=10, ncol=10)) 
s <- stack(r1, r2)

myfunc <- function(x,y){approx(x,c(0,1),y)}
newrast <- stackApply(stack,c(1,2), fun=myfunc(s,r3))

我对如何将多个变量传递给 stackApply 中的 fun= 参数感到困惑。我也不确定 ind= 论点。我想确保该功能是通过所有层完成的,而不是单独在整个层上完成,然后对每一层重复。

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    我认为stackApply 不适用于这里。你可以改用calc

    对于近似问题,可以考虑raster::approxNA

    s <- stack(r1, r2, r3)
    x <- approxNA(s)
    

    但如果这不起作用,你可以做类似的事情

    f <- function(x) x[1] * sum(x[-1])
    y <- calc(s, f)
    

    或者,考虑overlay

    s <- stack(r1, r2)
    z <- overlay(s, r3, fun=function(x, y) x * y)
    

    (我会实现你所追求的功能,但我不知道你的意思是“用堆栈创建的向量插入孤立栅格中匹配网格单元的值”)

    【讨论】:

    • 感谢您的回复。我理解你的困惑,因为这是一个我仍在努力思考的概念。我将研究 calc 或 overlay 而不是 stackApply,尽管我认为 approxNA 并不是我想要的。对于我的实际解决方案,我有一个由 10 个网格和 1 个单独的栅格组成的栅格堆栈。对于单个栅格中的每个单元格值,我想从堆栈中获取所有 10 个值,并使用 approx() 线性插值单个单元格值落在 10 内的位置。
    • 是否可以在光栅包中使用calc()并使用approx()作为提供的功能?
    • 是的,您可以执行f &lt;- function(x, y) approx(1:10, y, x)$y 之类的操作(其中 10 是层数)。但是为了清楚起见,您应该真正展示您所说的功能(对于向量和值)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2019-08-25
    • 2017-01-18
    • 2018-09-27
    • 1970-01-01
    相关资源
    最近更新 更多