You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言基于栅格与Dataframe值替换生成新栅格的实现咨询

实现步骤

你可以直接用raster包内置的subs和cover两个函数组合实现需求,逻辑非常简洁:

  1. 先用subs将Clustraster中1-8的聚类值替换为Clust表中对应的MAT值,不在匹配表中的0值会自动转为NA
  2. 再用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:06:03