写在前面
最近发现一个问题,剪样方剪了很多年,发现大家计算重要值的时候还是在用execl计算,这样的效率会有些低,在网上查了一下也没计算代码或较为便捷的工具,索性自己写一个代码,好让师弟师妹们不再进行繁琐的计算。重要值的计算原理如下:
其实就是,假设我们测定了四度一量(高度、盖度、密度、频度、生物量),然后想计算这个样方中每个物种的重要值,我们只需要计算该样方中所有物种的总平均高度、总盖度、总密度、总频度、总生物量,然后用每个物种的对应值除以总值求出该指标的相对值,然后加起来求均值即可。
数据准备
最准备的数据如下,小编已上传,文末下载。
ps:family列就是功能群的划分;其余的分别是高度、盖度、丰度、频度、生物量。为什么
丰度、频度是NA呢,因为我一般做的时候不测这两个指标,只用其余三个指标计算重要值。好多论文里也只用高度、盖度、生物量。但是,要是你测了所有的或者只测了其中的2-3个指标,只用你测的指标去计算也可以,记得在原始数据中标记成NA就行,代码计算的时候全是NA的指标会被忽略。
计算代码
计算代码分为两部分,第一部分的计算会展示所有物种的重要值计算结果;第二部分则会展示以功能群为基础的计算结果。
# 加载dplyr包
library(dplyr)
# 读取数据文件
species_data 1)
# 计算每个物种的高度均值,忽略NA值
height_columns "^height", names(species_data)) # 找到所有包含"height"的列
species_data$mean_height 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