如何在R中对数据框内多组样本计算Shannon Index
在R中按样本计算Shannon多样性指数
1. 导入你的样本数据
先把你提供的表格转换成R可直接使用的数据框,复制以下代码运行即可:
sample_data <- data.frame( Sample = c("17a", "17a", "17a", "17a", "17b", "17b", "17b", "17b", "18a", "18a", "18a", "18a"), Species = c("Shark", "Dolphin", "Sting Ray", "Badger", "Shark", "Dolphin", "Sting Ray", "Badger", "Shark", "Dolphin", "Sting Ray", "Badger"), Count = c(17, 25, 1, 234, 4, 6, 19, 25, 45, 4, 4, 3) )
2. 手动计算(理解原理)
Shannon指数公式为:( H = -\sum (p_i \times \ln(p_i)) ),其中( p_i )是单个物种个体数占样本总个体数的比例。我们用dplyr包按样本分组计算,步骤如下:
# 安装并加载dplyr(首次使用需安装) install.packages("dplyr") library(dplyr) # 分组计算Shannon指数 shannon_manual <- sample_data %>% group_by(Sample) %>% mutate( total_individuals = sum(Count), # 计算每个样本的总个体数 proportion = Count / total_individuals, # 计算物种占比 term = proportion * log(proportion) # 计算公式中的单项 ) %>% summarise( Shannon_Index = -sum(term, na.rm = TRUE) # 求和取负得到指数,na.rm处理可能的NA值 ) # 查看结果 print(shannon_manual)
3. 用专业生态包快速计算(推荐)
vegan是生态领域常用的工具包,能一键计算多样性指数,步骤更简洁:
# 安装并加载vegan和tidyr(首次使用需安装) install.packages(c("vegan", "tidyr")) library(vegan) library(tidyr) # 将长格式数据转换为宽格式(样本行,物种列) wide_data <- sample_data %>% pivot_wider(names_from = Species, values_from = Count, values_fill = 0) # 提取计数矩阵,去掉Sample列 counts <- wide_data %>% select(-Sample) # 计算Shannon指数 shannon_values <- diversity(counts, index = "shannon") # 匹配样本名,生成结果表 shannon_result <- data.frame( Sample = wide_data$Sample, Shannon_Index = shannon_values ) # 查看结果 print(shannon_result)
说明
- 两种方法结果一致,
vegan::diversity默认使用自然对数,若需常用对数,可添加参数base = 10。 - 如果你的原始数据是从CSV/Excel导入的,可使用
read.csv()或readxl::read_excel()替代手动创建数据框。
内容的提问来源于stack exchange,提问作者helpmeplease
相关产品推荐
相关产品推荐

