在terra中如何将栅格值替换为属性表的指定分类值
解决方法
你的问题出在classify和subst的参数设置错误——你指定的替换目标值(0-2)并不是原栅格的实际值(原栅格值是1-9),自然不会生效。以下是几种正确的实现方式:
方法一:直接通过属性表映射替换值
利用match函数将原栅格值与属性表中的id匹配,提取对应的y值赋值给新栅格,最后移除属性层级:
library(terra) # 你的原始代码 r <- rast(nrows=3, ncols=3) values(r) <- 1:9 y_table <- data.frame(id=1:9, y=c(0,0,1,0,1,1,2,2,2)) levels(r) <- y_table # 生成简化栅格 r_simplified <- r # 匹配原栅格值到id,提取对应y值 values(r_simplified) <- y_table$y[match(values(r), y_table$id)] # 移除属性表层级 levels(r_simplified) <- NULL
方法二:使用classify函数(正确配置rcl矩阵)
构建包含原栅格值-目标替换值对应关系的分类矩阵(rcl),再传入classify:
# 构建正确的分类规则矩阵:第一列原id,第二列目标y值 rcl_matrix <- as.matrix(y_table) r_simplified <- classify(r, rcl = rcl_matrix) # 移除属性层级 levels(r_simplified) <- NULL
方法三:使用subst函数(正确传入新旧值向量)
subst需要明确传入原栅格的旧值向量和对应的新值向量:
r_simplified <- subst(r, from = y_table$id, to = y_table$y) # 移除属性层级 levels(r_simplified) <- NULL
验证结果:运行values(r_simplified)会得到c(0,0,1,0,1,1,2,2,2),符合你的需求。
内容的提问来源于stack exchange,提问作者Reid L
相关产品推荐
相关产品推荐

