为何R语言terra包中SpatRast使用&索引时结果不符合预期?
terra与raster包逻辑索引行为差异的原因
代码复现
# terra包示例 r1 <- terra::rast(ncols=5, nrows=5, xmin=0, xmax=5, ymin=0, ymax=5) r1[] <- 1:25 s1 <- r1 r1[s1>9 & r1>9] #[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # raster包示例 r2 <- raster::raster(ncols=5, nrows=5, xmn=0, xmx=5, ymn=0, ymx=5) r2[] <- 1:25 s2 <- r2 r2[s2>9 & r2>9] #[1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
差异原因
两者的核心差异来自两个包对栅格对象索引逻辑的设计不同:
- raster包:当使用逻辑表达式(返回raster对象)作为索引时,会自动将该逻辑栅格转换为逻辑向量,遵循常规R的向量索引规则——仅提取逻辑值为
TRUE对应的元素,因此返回符合条件的10-25。 - terra包:当使用逻辑型SpatRast对象作为索引时,其设计逻辑是选择该索引栅格中所有非NA的单元格。而逻辑栅格中的
FALSE并不等同于NA,因此所有单元格都会被选中,最终返回全部元素1-25。
terra包的正确写法
如果要在terra中实现和raster相同的提取效果,需要先将逻辑栅格转换为向量,再进行索引:
# 方式1:先提取值再索引 values(r1)[values(s1>9 & r1>9)] # 方式2:直接用向量索引栅格 r1[values(s1>9 & r1>9)]
内容的提问来源于stack exchange,提问作者TVolt
相关产品推荐
相关产品推荐

