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

如何在R语言中将3D物种概率数组转换为分物种的2D结果数组

处理spOccupancy输出的3D概率数组拆分问题

问题背景

我有一个名为OccProbs的多维数组,结构为num [1:750, 1:42, 1:8099]:

  • 1:750:750个物种存在概率样本
  • 1:42:42个目标物种
  • 1:8099:研究区的8099个像素

该数组由R语言spOccupancy包的spMsPGOcc()和predict()函数生成,对应predict()返回的$psi.0.samples。

需求是将这个3D数组拆分,得到每个物种在每个像素的样本概率均值(同时保留标准差),且像素顺序与原数组一致。之前尝试的代码报错,且无法按物种拆分:

plot.dat <- data.frame(x = Coords$Easting, 
                       y = Coords$Northing, 
                       mean.psi = apply(OccProbs, c(1,3), mean), 
                       sd.psi = apply(OccProbs, c(1,3), sd))

错误信息:arguments imply differing number of rows: 8099, 750

期望转换结果:将原3D数组拆分为多个独立的2D数组,每个对应一个物种,格式示例(以Species_A为例):

Species_A
         [mean]     [sd]
[Pixel_1]4.666      1.699
[Pixel_2]4.666      1.247
[Pixel_3]3.000      0.816
...

解决方案

1. 明确维度处理逻辑

原数组维度为样本数×物种数×像素数,需针对每个物种,计算所有样本在每个像素上的均值和标准差。核心是按物种维度(第2维)循环,对每个物种的切片,按像素维度(第3维)统计。

2. 代码实现

# 获取物种总数
n_species <- dim(OccProbs)[2]

# 遍历每个物种,生成对应结果
species_results <- lapply(1:n_species, function(sp_idx) {
  # 提取当前物种的所有样本-像素数据
  sp_slice <- OccProbs[, sp_idx, ]
  # 计算每个像素的均值和标准差
  pixel_mean <- apply(sp_slice, 3, mean)
  pixel_sd <- apply(sp_slice, 3, sd)
  # 整理为数据框,保留原像素顺序
  result_df <- data.frame(mean = pixel_mean, sd = pixel_sd)
  # 设置行名为像素标识(可根据需求自定义)
  rownames(result_df) <- paste0("Pixel_", 1:length(pixel_mean))
  return(result_df)
})

# 给每个结果命名为对应物种(若有物种名称向量,可替换此处默认命名)
names(species_results) <- paste0("Species_", 1:n_species)

3. 坐标合并(可选)

如果需要将结果与坐标结合,以第一个物种为例:

sp1_with_coords <- cbind(Coords, species_results[[1]])

4. 原代码错误原因

之前的apply(OccProbs, c(1,3), mean)计算的是每个样本×像素组合的均值,得到750×8099的矩阵,而Coords只有8099行,行数不匹配导致报错。正确逻辑是先按物种提取切片,再针对像素维度统计,得到长度为8099的向量,与坐标行数一致。

内容的提问来源于stack exchange,提问作者Birdman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:01:08