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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:55:19