R技术问询:如何按站点合并多行并对物种列求和,保留列结构
解决方案
核心思路
先给数据框添加站点分组标识,移除不需要的Quadrat列后,按站点分组对物种列求和,最后基于求和结果计算站点级多样性指数。
步骤1:构造示例数据(可跳过,直接用你自己的df即可)
set.seed(123) df <- data.frame( Quadrat = paste0("Q", 1:75), matrix(sample(c(0,1), 75*65, replace = TRUE), nrow = 75) ) colnames(df)[-1] <- paste0("Species", 1:65)
步骤2:分组求和(两种方法任选)
方法一:Base R 实现
# 添加站点分组列:前25行A,中间25行B,最后25行C df$Site <- rep(c("A", "B", "C"), each = 25) # 移除Quadrat列 df_clean <- df[, !colnames(df) %in% "Quadrat"] # 按站点分组,对所有物种列求和 site_species_sum <- aggregate(. ~ Site, data = df_clean, sum)
方法二:dplyr 实现(更直观,适合新手)
library(dplyr) site_species_sum <- df %>% mutate(Site = rep(c("A", "B", "C"), each = 25)) %>% # 添加站点分组 select(-Quadrat) %>% # 移除Quadrat列 group_by(Site) %>% # 按站点分组 summarise(across(everything(), sum)) %>% # 对所有物种列求和 ungroup()
步骤3:计算站点级多样性指数
用vegan包(你提到的specnumber()和diversity()都来自这个包)计算:
library(vegan) # 物种丰富度(站点内存在的物种数量) site_species_sum$Richness <- specnumber(site_species_sum[, -1]) # 香农-威纳多样性指数 site_species_sum$Shannon <- diversity(site_species_sum[, -1], index = "shannon") # 辛普森多样性指数 site_species_sum$Simpson <- diversity(site_species_sum[, -1], index = "simpson")
你之前代码的问题说明
sum(df[1:25,])会把前25行所有元素合并成一个单一数值,不是按列求和;rowSums(df[1:25,])是计算前25行每行的总和,而非按列对25行求和;rbind是行合并,无法实现分组聚合的需求,应该用分组求和的函数(如aggregate或dplyr的group_by+summarise)。
内容的提问来源于stack exchange,提问作者Edouard Duquesne
相关产品推荐
相关产品推荐

