【问题标题】:Extract multiple values from raster using for loop使用 for 循环从栅格中提取多个值
【发布时间】:2021-03-20 22:55:28
【问题描述】:

我正在尝试使用以下 for 循环从栅格中提取多个单元格值:

testis <- NULL
for(i in paste0("y", 2011:2019)){
  testis[i] <- raster::extract(rf[[c(1, 3)]], i[, 1:2])
}

代替:

e_change <- raster::extract(rf[[c(1, 3)]], y2019[, 1:2]) #extract cell values

虽然,我收到以下错误:

h(simpleError(msg, call)) 中的错误: 在为函数“extract”选择方法时评估参数“y”时出错:维数不正确

【问题讨论】:

    标签: r raster


    【解决方案1】:

    一般使用示例数据(参见 ?stack)。

    发生错误是因为您迭代一维字符向量 (paste0("y",2011:2019) 并尝试像 data.frame i[,1:2] 那样对其进行子集化,这是二维的。 但是,raster::extract() 的第二个元素应该是:

    由两列矩阵或 data.frame 或 SpatialPoints* 表示的点;空间多边形*;空间线; sf 空间矢量对象;程度;或表示单元格数的数字向量

    因此您无法从字符向量中提取任何内容。 您可以使用单元格编号或点位置提取值,这似乎是您想要做的

    r <- raster(ncol=36, nrow=18, vals=1:(18*36))
    s <- stack(r,r*2,r/3)
    #extract with cell number
    raster::extract(s[[c(1, 3)]],c(1:100),df=T)
    #extract with points
    xy <- cbind(-50, seq(-80, 80, by=20))
    raster::extract(s[[c(1, 3)]],xy,df=T)
    sp <- SpatialPoints(xy)
    raster::extract(s[[c(1, 3)]],sp,df=T)
    

    只是关于速度问题的说明。如果由于堆栈维度或点(或多边形)的数量而导致值提取的计算量很大,则有一个很棒的函数 exact_extract() from exactextractr package 它比 raster::extract() 快得多,并且或多或少同样的论点。

    【讨论】:

    • 我认为我的目标是从包含 2010-2019 年的栅格中提取值,在一个循环中,与“extract(x,y)”一样,我必须为每个循环更改“y”年。
    • 但是'y'是什么?它是一个多边形对象吗?它是单元格索引的向量吗?它是一个点对象吗?您的栅格中包含哪些信息? 2010 年到 2019 年之间的一年?从您的代码来看,您的栅格似乎是一个栅格堆栈(您像堆栈一样将其子集化,rf[[c(1,3]]。请制作一个可重现的示例
    • 我不太确定,因为我已经有一段时间没有使用这个数据集了。虽然,如果我有一个猜测,那么rf 是一个栅格,其中包含在相对于各种栖息地的区域中遇到鸟类的估计概率,概率从 0 到 1。 y2019,我有自 2010 年以来的年度栖息地数据,我相信这会提取属于栖息地和区域的单元格中的那些值。因为rf 是使用随机森林从y2010 to y2019 中包含的数据派生而来的。我想我将y2019 从栅格数据转换为点数据,这样我就可以通过坐标进行提取。
    • 目标就像我之前提到的那样,一个循环提取多个栅格并将结果存储到睾丸中。
    • 在所有extract 函数(即raster::extractterra::extractexactextractr::exact_extract)中,您可以从栅格堆栈(多层栅格)中提取值,而无需遍历层。出于这个原因,我仍然不明白你真正想要做什么。如果你有一个点对象(即SpatialPointsSpatialPointsDataFramesfspatVect ecc 类),你可以简单地做:raster::extract(rasterstack,pointobj)
    猜你喜欢
    • 2016-04-09
    • 2021-07-05
    • 1970-01-01
    • 2020-05-10
    • 2016-08-27
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多