基于分割索引栅格与值栅格创建向量列表的技术实现问询
按分割索引分组提取栅格值的向量列表实现方案
你已经用raster包构建好了值栅格img和分割索引栅格segmentation,要实现按分割索引分组创建数值向量列表的话,咱们可以分几步来做,保证逻辑清晰且结果准确:
首先先补全你未写完的segmentation栅格(这里假设是10x10的完整分割矩阵,你可以根据实际数据替换调整):
library(raster) # 你的值栅格 img=raster(t(matrix(c(1,3,1,2,1,11,11,10,NA,NA,2,12,13,14,2,3,1,2,2,1,2,13,NA,12,0,1,2,20,21,2,3,12,13,14,3,2,21,22,21,1,1,2,3,2,2,1,1,NA,NA,1,NA,NA,13,14,NA,NA,27,6,6,5,NA,NA,NA,12,22,28,7,8,5,6,NA,NA,23,24,22,5,NA,NA,5,8,1,2,1,1,2,5,NA,NA,NA,NA,1,2,1,2,2,7,6,5,NA,NA),10,10))) # 补全后的分割索引栅格 segmentation=raster(t(matrix(c(1,1,1,1,1,4,4,4,4,4, 1,7,7,7,1,5,5,5,5,5, 1,7,7,7,1,5,5,6,6,5, 1,7,7,7,1,5,6,6,6,5, 1,1,1,1,1,5,6,6,6,5, 2,2,2,2,2,3,3,3,3,3, 2,8,8,8,2,3,3,9,9,3, 2,8,8,8,2,3,9,9,9,3, 2,8,8,8,2,3,9,9,9,3, 2,2,2,2,2,3,3,3,3,3),10,10)))
第一步:验证两个栅格的匹配性
这一步很关键,必须确保img和segmentation的范围、分辨率、坐标系完全一致,否则分组会出错:
# 检查栅格匹配情况,返回TRUE说明完全匹配 compareRaster(img, segmentation, res=TRUE, ext=TRUE, crs=TRUE)
第二步:提取栅格值并分组(两种实现方式)
方式一:Base R 实现
用values()提取栅格的所有值,合并成数据框后,用split()按分割索引分组,同时过滤掉值为NA的记录:
# 将两个栅格的值合并为数据框 raster_df <- data.frame( img_value = values(img), seg_index = values(segmentation) ) # 过滤NA值,然后按分割索引分组为向量列表 seg_value_list <- split( x = raster_df$img_value[!is.na(raster_df$img_value)], f = raster_df$seg_index[!is.na(raster_df$img_value)] ) # 查看结果,比如索引为1的向量 seg_value_list$`1`
方式二:Tidyverse 实现
如果你习惯用dplyr等tidyverse工具,代码会更直观:
library(dplyr) seg_value_list <- raster_df %>% filter(!is.na(img_value)) %>% # 过滤NA值 group_by(seg_index) %>% # 按分割索引分组 group_split(.keep = FALSE) %>% # 拆分为列表,只保留值列 lapply(unlist) # 将每个分组的 tibble 转为向量 # 查看结果,比如第一个分组(对应索引1) seg_value_list[[1]]
结果说明
最终得到的seg_value_list是一个命名列表(Base R方式)或有序列表(tidyverse方式),每个元素对应一个分割索引的数值向量,向量里包含该分割区域内所有非NA的栅格值。
内容的提问来源于stack exchange,提问作者MarujoRe
相关产品推荐
相关产品推荐

