按站点统计鸟类物种丰富度:统计含有效检测数据的列数
统计站点鸟类物种丰富度的实现方案
需求说明
现有一个记录110个站点两次独立调查鸟类检测次数的数据框,包含56个以Total.开头的物种列,需按站点统计至少有一次检测记录的物种数量(即物种丰富度),例如站点BRY2的丰富度为2。以下提供基础R实现和vegan包实现两种方案:
方法一:基础R原生实现
无需额外依赖包,通过分组聚合+逻辑判断完成统计:
- 筛选出所有以
Total.开头的物种列 - 按
Site分组,判断每个物种在该站点是否存在非零检测记录 - 对每个站点的判断结果求和,得到物种丰富度
# 假设数据框名为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()函数专为物种丰富度统计设计,结合聚合操作更高效:
- 按
Site聚合,计算每个物种在该站点的总检测次数(总和>0即代表有过检测) - 用
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
相关产品推荐
相关产品推荐

