使用 for 循环从栅格中提取多个值

时间:2021-03-20 22:55:28

标签: r raster

我正在尝试使用以下 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”时出错:维数不正确

1 个答案:

答案 0 :(得分:0)

通常使用示例数据(参见?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() package 中有一个很棒的函数 exactextractr,它比 {{1} 快}} 并有或多或少相同的论点。