写在前面
最近发现一个问题,剪样方剪了很多年,发现大家计算重要值的时候还是在用execl计算,这样的效率会有些低,在网上查了一下也没计算代码或较为便捷的工具,索性自己写一个代码,好让师弟师妹们不再进行繁琐的计算。重要值的计算原理如下:
其实就是,假设我们测定了四度一量(高度、盖度、密度、频度、生物量),然后想计算这个样方中每个物种的重要值,我们只需要计算该样方中所有物种的总平均高度、总盖度、总密度、总频度、总生物量,然后用每个物种的对应值除以总值求出该指标的相对值,然后加起来求均值即可。
数据准备
最准备的数据如下,小编已上传,文末下载。
ps:family列就是功能群的划分;其余的分别是高度、盖度、丰度、频度、生物量。为什么丰度、频度是NA呢,因为我一般做的时候不测这两个指标,只用其余三个指标计算重要值。好多论文里也只用高度、盖度、生物量。但是,要是你测了所有的或者只测了其中的2-3个指标,只用你测的指标去计算也可以,记得在原始数据中标记成NA就行,代码计算的时候全是NA的指标会被忽略。
计算代码
计算代码分为两部分,第一部分的计算会展示所有物种的重要值计算结果;第二部分则会展示以功能群为基础的计算结果。
# 加载dplyr包
library(dplyr)
# 读取数据文件
species_data <- read.csv(file.choose(), header = TRUE, row.names = 1)
# 计算每个物种的高度均值,忽略NA值
height_columns <- grep("^height", names(species_data)) # 找到所有包含"height"的列
species_data$mean_height <- apply(species_data[, height_columns], 1, function(x) mean(as.numeric(x), na.rm = TRUE))
# 确保其他列是数值类型
species_data$coverage <- as.numeric(species_data$coverage)
species_data$biomass <- as.numeric(species_data$biomass)
species_data$abundance <- as.numeric(species_data$abundance)
species_data$frequency <- as.numeric(species_data$frequency)
# 计算各个指标的总和,忽略NA值
total_height <- sum(species_data$mean_height, na.rm = TRUE)
total_coverage <- sum(species_data$coverage, na.rm = TRUE)
total_biomass <- sum(species_data$biomass, na.rm = TRUE)
total_abundance <- sum(species_data$abundance, na.rm = TRUE)
total_frequency <- sum(species_data$frequency, na.rm = TRUE)
# 定义计算重要值的函数
calculate_importance_value <- function(row) {
row <- as.numeric(row)
valid_values <- c()
if (!is.na(row[1])) valid_values <- c(valid_values, row[1] / total_height) # mean_height
if (!is.na(row[2])) valid_values <- c(valid_values, row[2] / total_coverage) # coverage
if (!is.na(row[3])) valid_values <- c(valid_values, row[3] / total_biomass) # biomass
if (!is.na(row[4])) valid_values <- c(valid_values, row[4] / total_abundance) # abundance
if (!is.na(row[5])) valid_values <- c(valid_values, row[5] / total_frequency) # frequency
if (length(valid_values) == 0) return(0)
importance_value <- mean(valid_values)
return(importance_value)
}
# 计算每个物种的重要值
species_data$importance_value <- apply(species_data[, c("mean_height", "coverage", "biomass", "abundance", "frequency")], 1, calculate_importance_value)
# 1. 输出所有物种的计算结果
print(species_data)
write.csv(species_data, "所有物种计算结果.csv", row.names = TRUE)
计算结果如下,设置好工作目录就可将就算结果保存出来
> print(species_data)
species family height_1 height_2 height_3 height_4 height_5 coverage abundance frequency biomass mean_height importance_value
1 Species1 禾本科 NA NA NA NA NA NA NA NA NA NaN 0.00000000
2 Species2 禾本科 8.7 8.5 7.5 5.8 11.7 8 NA NA 3.746 8.440000 0.10087236
3 Species3 禾本科 3.7 3.5 1.6 NA NA 1 NA NA 0.011 2.933333 0.02471627
4 Species4 禾本科 NA NA NA NA NA NA NA NA NA NaN 0.00000000
5 Species5 禾本科 3.5 6.7 5.3 4.2 4.5 20 NA NA 5.060 4.840000 0.11062193
6 Species6 禾本科 NA NA NA NA NA NA NA NA NA NaN 0.00000000
7 Species7 禾本科 NA NA NA NA NA NA NA NA NA NaN 0.00000000
8 Species8 莎草科 5.1 3.4 4.2 4.7 5.2 22 NA NA 22.974 4.520000 0.19305488
9 Species9 莎草科 4.7 9.6 7.5 5.8 7.8 13 NA NA 4.386 7.080000 0.10640006
10 Species10 豆科 1.2 1.3 2.7 1.6 1.4 3 NA NA 1.340 1.640000 0.02605831
11 Species11 豆科 2.7 3.1 2.5 2.7 3.2 4 NA NA 0.280 2.840000 0.03296195
然后是基于功能群结果的计算
# 1. 输出所有物种的计算结果
print(species_data)
write.csv(species_data, "所有物种计算结果.csv", row.names = TRUE)
# 2. 按物种分类进行分组计算指标的总和
# 物种的分类信息存储在`family`列中
category_summary <- species_data %>%
group_by(family) %>%
summarise(
total_mean_height = sum(mean_height, na.rm = TRUE),
total_coverage = sum(coverage, na.rm = TRUE),
total_biomass = sum(biomass, na.rm = TRUE),
total_abundance = sum(abundance, na.rm = TRUE),
total_frequency = sum(frequency, na.rm = TRUE),
total_importance_value = sum(importance_value, na.rm = TRUE)
)
# 输出分组计算结果
print(category_summary)
# 写入分组计算结果的CSV文件
write.csv(category_summary, "物种类别总和结果.csv", row.names = FALSE)
计算结果如下
> print(category_summary)
# A tibble: 4 x 7
family total_mean_height total_coverage total_biomass total_abundance total_frequency total_importance_value
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 杂类草 12.0 58 37.2 0 0 0.405
2 禾本科 16.2 29 8.82 0 0 0.236
3 莎草科 11.6 35 27.4 0 0 0.299
4 豆科 4.48 7 1.62 0 0 0.0590
okay,到这儿我们既有了每个物种的重要值,还知道了功能群的重要值以及高度、盖度、生物量等。
完整版代码如下
# 读取数据文件
species_data <- read.csv(file.choose(), header = TRUE, row.names = 1)
# 计算每个物种的高度均值,忽略NA值
height_columns <- grep("^height", names(species_data)) # 找到所有包含"height"的列
species_data$mean_height <- apply(species_data[, height_columns], 1, function(x) mean(as.numeric(x), na.rm = TRUE))
# 确保其他列是数值类型
species_data$coverage <- as.numeric(species_data$coverage)
species_data$biomass <- as.numeric(species_data$biomass)
species_data$abundance <- as.numeric(species_data$abundance)
species_data$frequency <- as.numeric(species_data$frequency)
# 计算各个指标的总和,忽略NA值
total_height <- sum(species_data$mean_height, na.rm = TRUE)
total_coverage <- sum(species_data$coverage, na.rm = TRUE)
total_biomass <- sum(species_data$biomass, na.rm = TRUE)
total_abundance <- sum(species_data$abundance, na.rm = TRUE)
total_frequency <- sum(species_data$frequency, na.rm = TRUE)
# 定义计算重要值的函数
calculate_importance_value <- function(row) {
row <- as.numeric(row)
valid_values <- c()
if (!is.na(row[1])) valid_values <- c(valid_values, row[1] / total_height) # mean_height
if (!is.na(row[2])) valid_values <- c(valid_values, row[2] / total_coverage) # coverage
if (!is.na(row[3])) valid_values <- c(valid_values, row[3] / total_biomass) # biomass
if (!is.na(row[4])) valid_values <- c(valid_values, row[4] / total_abundance) # abundance
if (!is.na(row[5])) valid_values <- c(valid_values, row[5] / total_frequency) # frequency
if (length(valid_values) == 0) return(0)
importance_value <- mean(valid_values)
return(importance_value)
}
# 计算每个物种的重要值
species_data$importance_value <- apply(species_data[, c("mean_height", "coverage", "biomass", "abundance", "frequency")], 1, calculate_importance_value)
# 1. 输出所有物种的计算结果
print(species_data)
write.csv(species_data, "所有物种计算结果.csv", row.names = TRUE)
# 2. 按物种分类进行分组计算指标的总和
# 物种的分类信息存储在`family`列中
category_summary <- species_data %>%
group_by(family) %>%
summarise(
total_mean_height = sum(mean_height, na.rm = TRUE),
total_coverage = sum(coverage, na.rm = TRUE),
total_biomass = sum(biomass, na.rm = TRUE),
total_abundance = sum(abundance, na.rm = TRUE),
total_frequency = sum(frequency, na.rm = TRUE),
total_importance_value = sum(importance_value, na.rm = TRUE)
)
# 输出分组计算结果
print(category_summary)
# 写入分组计算结果的CSV文件
write.csv(category_summary, "物种类别总和结果.csv", row.names = FALSE)
脚本与示例数据下载
下载的时候顺便点个赞呗~
关注公众号“生态R学社”回复“重要值”即可下载完整代码与示例数据