如何编写R函数按类别逐次随机删除1个数据点计算珊瑚礁覆盖率
珊瑚礁覆盖率随采样点数变化分析R实现
前提说明
- 此处默认S、C、SP为珊瑚类标注,T为非珊瑚类标注,你可以根据实际标注规则调整珊瑚判定逻辑
- 核心逻辑:每轮操作对每张照片/样地随机删除1个点位,重新计算全量覆盖率,逐轮迭代直到单张照片仅剩1个点位
示例数据加载
首先把你提供的示例数据转为R可用的data.frame格式:
# 加载需要的依赖包,如果未安装先运行 install.packages("dplyr") library(dplyr) # 导入示例数据 df <- data.frame( plot_id = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3), label = c("S","S","S","T","T","S","C","C","SP","S","S","T","T","C","T") )
核心分析函数编写
calc_cover_by_npoints <- function(data, plot_col = "plot_id", label_col = "label", coral_labels = c("S","C","SP")){ # 参数说明: # data: 输入数据框 # plot_col: 样地/照片ID对应的列名 # label_col: 点位标注对应的列名 # coral_labels: 属于珊瑚的标注值向量,可根据实际情况修改 # 计算单张照片最大点位数量,决定迭代轮次 max_points_per_plot <- max(table(data[[plot_col]])) # 初始化结果存储数据框 res <- data.frame(total_points = integer(), cover_rate = numeric()) # 全量点位的基准结果 total_n <- nrow(data) coral_n <- sum(data[[label_col]] %in% coral_labels) res <- rbind(res, data.frame(total_points = total_n, cover_rate = coral_n/total_n)) # 逐轮删点迭代 for(i in 1:(max_points_per_plot - 1)){ # 每个样地随机保留 (max_points_per_plot - i) 个点位 data_filtered <- data %>% group_by(.data[[plot_col]]) %>% slice_sample(n = max_points_per_plot - i) %>% ungroup() # 计算当前轮次覆盖率 current_total <- nrow(data_filtered) current_coral <- sum(data_filtered[[label_col]] %in% coral_labels) res <- rbind(res, data.frame(total_points = current_total, cover_rate = current_coral/current_total)) } return(res) }
运行测试
你可以直接用示例数据测试函数效果:
# 设定随机种子保证结果可复现,不需要可删除该行 set.seed(123) # 运行分析 result <- calc_cover_by_npoints(df) # 打印结果 print(result) # 可以绘图可视化变化趋势 plot(result$total_points, result$cover_rate, type = "b", xlab = "总采样点数", ylab = "珊瑚礁覆盖率估算值")
注:因为涉及随机抽样,不设定随机种子的情况下每次运行结果会有小幅波动,属于正常现象。
相关学习参考渠道
- R基础语法可参考官方内置帮助文档,运行
?函数名即可查看对应函数的详细说明 - 数据处理相关操作可学习dplyr包的官方文档内容
- 生态学采样精度相关的分析逻辑可以参考经典的群落调查数据分析类教材
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

