样方重要值自动化计算

学术   2025-01-22 18:03   云南  

写在前面

最近发现一个问题,剪样方剪了很多年,发现大家计算重要值的时候还是在用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)
# 计算各个指标的总和,忽略NAtotal_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_value1   Species1 禾本科       NA       NA       NA       NA       NA       NA        NA        NA      NA         NaN       0.000000002   Species2 禾本科      8.7      8.5      7.5      5.8     11.7        8        NA        NA   3.746    8.440000       0.100872363   Species3 禾本科      3.7      3.5      1.6       NA       NA        1        NA        NA   0.011    2.933333       0.024716274   Species4 禾本科       NA       NA       NA       NA       NA       NA        NA        NA      NA         NaN       0.000000005   Species5 禾本科      3.5      6.7      5.3      4.2      4.5       20        NA        NA   5.060    4.840000       0.110621936   Species6 禾本科       NA       NA       NA       NA       NA       NA        NA        NA      NA         NaN       0.000000007   Species7 禾本科       NA       NA       NA       NA       NA       NA        NA        NA      NA         NaN       0.000000008   Species8 莎草科      5.1      3.4      4.2      4.7      5.2       22        NA        NA  22.974    4.520000       0.193054889   Species9 莎草科      4.7      9.6      7.5      5.8      7.8       13        NA        NA   4.386    7.080000       0.1064000610 Species10   豆科      1.2      1.3      2.7      1.6      1.4        3        NA        NA   1.340    1.640000       0.0260583111 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学社”回复“重要值”即可下载完整代码与示例数据



走天涯徐小洋地理数据科学
一个爱生活的地理土博,分享GIS、遥感、空间分析、R语言、景观生态等地理数据科学实操教程、经典文献、数据资源
 最新文章