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

按站点统计鸟类物种丰富度:统计含有效检测数据的列数

统计站点鸟类物种丰富度的实现方案

需求说明

现有一个记录110个站点两次独立调查鸟类检测次数的数据框,包含56个以Total.开头的物种列,需按站点统计至少有一次检测记录的物种数量(即物种丰富度),例如站点BRY2的丰富度为2。以下提供基础R实现和vegan包实现两种方案:


方法一:基础R原生实现

无需额外依赖包,通过分组聚合+逻辑判断完成统计:

  1. 筛选出所有以Total.开头的物种列
  2. 按Site分组,判断每个物种在该站点是否存在非零检测记录
  3. 对每个站点的判断结果求和,得到物种丰富度
# 假设数据框名为bird_data,先加载数据(示例)
# bird_data <- read.csv("your_bird_data.csv")

# 提取所有物种列名
species_cols <- grep("^Total\\.", names(bird_data), value = TRUE)

# 按站点分组,判断每个物种是否有过检测(any(x>0)表示该站点至少有一次非零记录)
site_check <- aggregate(
  . ~ Site,
  data = bird_data[, c("Site", species_cols)],
  FUN = function(x) as.integer(any(x > 0))
)

# 计算每个站点的物种丰富度
site_check$Richness <- rowSums(site_check[, species_cols])

# 提取最终结果:站点+丰富度
final_result <- site_check[, c("Site", "Richness")]

方法二:使用vegan包实现

vegan包的specnumber()函数专为物种丰富度统计设计,结合聚合操作更高效:

  1. 按Site聚合,计算每个物种在该站点的总检测次数(总和>0即代表有过检测)
  2. 用specnumber()统计每行(站点)的非零物种数量
library(vegan)

# 提取物种列(同基础方法)
species_cols <- grep("^Total\\.", names(bird_data), value = TRUE)

# 按站点聚合,计算每个物种的总检测次数
site_total <- aggregate(
  . ~ Site,
  data = bird_data[, c("Site", species_cols)],
  FUN = sum
)

# 将物种数据转为矩阵,适配vegan函数
species_matrix <- as.matrix(site_total[, species_cols])

# 计算物种丰富度
site_total$Richness <- specnumber(species_matrix)

# 提取最终结果
final_result <- site_total[, c("Site", "Richness")]

结果验证

以示例中的BRY2站点为例,聚合后Total.ACFL总次数为1、Total.AMGO总次数为5,其余物种总次数为0,因此丰富度为2,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:13:33