【问题标题】:How to use apply functions on multiple raster stacks如何在多个栅格堆栈上使用应用函数
【发布时间】:2020-07-02 11:27:57
【问题描述】:

亲爱的 R 程序员, 我试图在使用特定时将循环转换为应用类型公式 称为 dissever 的函数。它是一种缩小功能,适用于栅格数据。 它需要一个粗略的输入 rasterLayer 和一堆协变量并生成一个模型对象 包括输入 rasterLayer 的高分辨率版本 例如:

library(dissever)
library(raster)

mod.fine = dissever(
    coarse = edgeroi$carbon,   # coarse resolution raster  
    fine = edgeroi$predictors, # stack of fine resolution covariates
    method = "lm", # regression method used
    p = 0.05, # proportion of pixels sampled for training regression model

  )

我想使用一堆粗略的输入层,而不是单个 rasterLayer。我可以使用一个循环来拟合一个模型,该模型对粗略堆栈的每一层使用相同的高分辨率预测器堆栈,并且我可以将结果存储在一个列表中。例如。 :

#create the stack of coarse layers

Stack.coarse = stack(edgeroi$carbon,edgeroi$carbon*2)


test = list()

   for(i in 1:nlayers(Stack.coarse)) {
     tmp=dissever(coarse=Stack.coarse[[i]],fine=edgeroi$predictors,method="lm",p=0.05)
       test[[i]]=tmp
  }

但我想避免循环,而是想使用应用函数。 栈是一种特殊类型的列表,必要时可以使用 as.list(stack.name) 转换为列表

但是,我找不到允许我使用 lapply 或 mapply 而不是循环的正确语法,因为这些函数似乎只需要一个列表,而输入中有 2 个单独的堆栈(列表)。

有人可以帮忙吗, 莎拉

【问题讨论】:

  • 你的描述不是很清楚。您是否为每个粗网格单元拟合了一个模型,然后将该模型应用于落入粗网格单元的所有细网格单元? (这将是一个棘手但有趣的问题)。或者你用粗略数据拟合一个全局模型(在这种情况下你可以使用predict

标签: r loops regression apply raster


【解决方案1】:

您可以使用mapply 运行获取等长列表的相应元素的函数。例如:

> one = list(1,2,3,4,5)
> two = list(4,3,4,3,4)

然后:

> mapply(function(aone, atwo){aone+atwo}, one,two)
[1] 5 5 7 7 9

如果你的函数的输出更复杂,你会得到一个它们的列表:

> mapply(function(aone, atwo){list(aone+atwo)}, one,two)
[[1]]
[1] 5

[[2]]
[1] 5

[[3]]
[1] 7

[[4]]
[1] 7

[[5]]
[1] 9

如果您的列表不等长,则 R 将应用其通常的回收规则,并在一个列表不适合另一个列表的整数次时抱怨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多