如何基于二维物种映射提取四维stars数组的对应时序数据?
基于物种映射提取stars数据集对应时间序列
需求背景
我们有一个四维时空stars数据集dat(维度:x,y,year,tree_species),包含4种树种的年度变量值;同时有一个二维物种映射species_map,记录每个(x,y)像素对应的树种。需要逐像素提取匹配树种的年度时间序列,最终得到一个三维(x,y,year)的stars对象。
解决方案(基础R命令实现)
利用数组索引直接提取对应数据,步骤如下:
获取树种维度的位置索引
将species_map中的因子类型树种转换为dat中树种维度对应的位置(1-4,对应"bu","fi","ki","ei"):# 获取每个像素对应的树种在dat中的维度位置 species_idx <- as.integer(species_map$tree_species)构建三维索引矩阵
将二维的树种索引扩展为三维(匹配x,y,year的维度),每个像素对应所有年份的树种索引:# 重复树种索引5次(对应5个年份),调整维度为(10,10,5) idx_3d <- array(rep(species_idx, each = 5), dim = c(10,10,5))提取对应数据并重构数组
生成所有x,y,year的位置组合,结合树种索引从dat中提取数据,再重构为三维数组:# 生成x,y,year的所有位置组合 grid <- expand.grid(x = 1:10, y = 1:10, year = 1:5) # 组合索引并提取数据 extracted_data <- dat$data_val[cbind(grid$x, grid$y, grid$year, as.vector(idx_3d))] # 重构为三维数组 extracted_array <- array(extracted_data, dim = c(10,10,5))转换为stars对象并设置维度信息
将重构后的数组转为stars对象,复用原数据集的维度属性:# 创建三维stars对象 result <- st_as_stars(extracted_array) |> setNames("data_val") |> st_set_dimensions(names = c("x","y","year")) |> # 复用原dat的年份维度值 st_set_dimensions("year", values = st_get_dimensions(dat)$year$values) |> # 复用原dat的x、y维度信息 st_set_dimensions(c("x","y"), values = st_get_dimensions(dat)[c("x","y")])验证结果
查看维度或绘图确认结果:# 查看维度信息 st_dimensions(result) # 绘制2018年的结果 plot(result[, , 1])
关键说明
- 利用基础R数组索引机制,避开了
ifelse等操作的维度不匹配问题 - 通过构建四维索引矩阵,直接从原四维数组提取对应位置数据,保证逐像素匹配的准确性
内容的提问来源于stack exchange,提问作者paulsw
相关产品推荐
相关产品推荐

