如何依据已有栅格的数值分布为新栅格生成随机单元格数值
按原栅格数值比例随机填充新栅格(terra包)
需求说明
现有一个terra包的栅格r,其中值1出现5次、值2出现15次、值3出现20次、值4出现60次,对应占比为5%、15%、20%、60%。需要创建一个尺寸不同的新栅格NEW.RASTER,并按照相同比例随机分配1-4的数值。
解决方案步骤
- 提取原栅格的数值及对应出现频率,作为抽样权重
- 根据新栅格的像素总数,按权重随机抽取对应数量的数值
- 将抽样结果赋值给新栅格
完整代码实现
# 加载terra包(未加载时执行) library(terra) # 原栅格创建(用户提供代码) r <- rast(ncol=10,nrow=10, vals=1) r[6:20] <- 2 r[21:40] <- 3 r[41:100] <- 4 # 创建新栅格(用户提供代码) NEW.RASTER <- rast(ncol=15,nrow=350) # 提取原栅格数值与对应频次 freq_table <- freq(r) target_values <- freq_table$value sample_weights <- freq_table$count # 计算新栅格总像素数 total_pixels <- ncell(NEW.RASTER) # 按原比例随机抽样 random_values <- sample(target_values, size = total_pixels, replace = TRUE, prob = sample_weights) # 赋值给新栅格 values(NEW.RASTER) <- random_values # 可选:验证新栅格数值分布 freq(NEW.RASTER)
代码说明
freq(r):获取原栅格各数值的出现次数,生成包含数值和对应频次的表格ncell(NEW.RASTER):计算新栅格的总像素量,确保抽样数量与栅格容量匹配sample(..., prob = sample_weights):以原栅格数值的出现次数为权重抽样,保证新栅格数值占比与原栅格一致values(NEW.RASTER) <- random_values:将抽样结果批量赋值给新栅格的所有像素
内容的提问来源于stack exchange,提问作者CARLOS_BEDSON
相关产品推荐
相关产品推荐

