R语言基于栅格与Dataframe值替换生成新栅格的实现咨询
实现步骤
你可以直接用raster包内置的subs和cover两个函数组合实现需求,逻辑非常简洁:
- 先用
subs将Clustraster中1-8的聚类值替换为Clust表中对应的MAT值,不在匹配表中的0值会自动转为NA - 再用
cover函数将上一步得到的栅格中的NA值,用ClimRaster对应位置的数值填充,刚好对应原0值的替换规则
完整可运行代码
library(raster) # 示例数据生成 # 生成年平均温度栅格 R1 = matrix(runif(100, -5, 12), nrow=10, ncol=10, byrow = TRUE) ClimRaster <- raster(R1) plot(ClimRaster, main="MAT°C") text(ClimRaster, cex=0.5) # 生成聚类栅格 R2 = matrix(sample(0:8, 9, replace =F), nrow=10, ncol=10, byrow = TRUE) Clustraster <- raster(R2) plot(Clustraster, main="Clusters") text(Clustraster, cex=0.5) # 聚类对应的MAT对照表 Clust<- data.frame(Cluster=c(1,2,3,4,5,6,7,8), MAT=c(2.5, 3, 4.5, 7, 8.5, 9, 10, 12)) # 核心实现代码 # 1. 聚类值替换为对应MAT,0值转为NA clust_mat_raster <- subs(Clustraster, Clust, by = "Cluster", which = "MAT") # 2. 用ClimRaster填充NA(原0值位置) result_raster <- cover(clust_mat_raster, ClimRaster) # 结果验证 # 查看原0值位置的结果是否和ClimRaster一致 zero_cells <- Which(Clustraster == 0, cells = TRUE) print("原0值位置对比:") print(data.frame( ClimRaster_value = ClimRaster[zero_cells][1:5], result_value = result_raster[zero_cells][1:5] )) # 查看原聚类1的位置结果是否等于对应MAT 2.5 one_cells <- Which(Clustraster == 1, cells = TRUE) print("原聚类1位置结果:") print(result_raster[one_cells][1:5])
补充说明
如果你的栅格数据量非常大,也可以用terra包(raster的官方升级包)实现,逻辑完全一致,处理速度会快很多,只需要把raster对象转为terra的SpatRaster对象,调用classify和cover方法即可。
内容的提问来源于stack exchange,提问作者user2180041
相关产品推荐
相关产品推荐

