求助:如何用R基于relBA规则对样地数据框进行分类
问题描述

现有包含样地(plots)和各物种相对断面积(relBA)的数据框,需新增一列,按以下规则将样地划分为1/2/3类:
- 1类:样地内relBA最高的物种值>0.5,且该值是次高relBA的2倍以上
- 2类:前两大优势物种的relBA之和≥0.8,且次高relBA > 第三高relBA + 0.2
- 3类:不符合上述两类的所有情况
R语言实现方案
我们可以用dplyr包高效处理分组逻辑,步骤如下:
1. 准备示例数据(模拟你的数据结构)
library(dplyr) # 模拟样地-物种-relBA数据 df <- tibble( plot = c(rep("A", 3), rep("B", 4), rep("C", 5), rep("D", 3)), species = c("Sp1", "Sp2", "Sp3", "Sp1", "Sp2", "Sp3", "Sp4", "Sp1", "Sp2", "Sp3", "Sp4", "Sp5", "Sp1", "Sp2", "Sp3"), relBA = c(0.6, 0.25, 0.15, 0.5, 0.35, 0.1, 0.05, 0.3, 0.3, 0.2, 0.1, 0.1, 0.4, 0.3, 0.3) )
2. 编写分类逻辑代码
df_classified <- df %>% # 按样地分组,确保每个样地单独计算 group_by(plot) %>% # 提取每个样地前3高的relBA值,不足3个的补NA mutate( top1 = max(relBA), top2 = sort(relBA, decreasing = TRUE)[2], top3 = sort(relBA, decreasing = TRUE)[3], top1_top2_sum = top1 + top2 ) %>% # 按规则执行分类(优先级:1类 > 2类 > 3类) mutate( plot_class = case_when( top1 > 0.5 & top1 > 2*top2 ~ "1类", # 处理无第三物种的情况:将NA的top3视为0 top1_top2_sum >= 0.8 & (top2 > (ifelse(is.na(top3), 0, top3) + 0.2)) ~ "2类", TRUE ~ "3类" ) ) %>% ungroup() %>% # 移除中间计算列,保留原始列和分类结果 select(-top1, -top2, -top3, -top1_top2_sum)
3. 查看分类结果
print(df_classified)
代码说明
group_by(plot):实现按样地独立计算,避免跨样地干扰sort(relBA, decreasing = TRUE)[n]:快速提取第n高的relBA值case_when():按规则优先级判断,确保符合多个规则的样地归为优先级更高的类别- 针对物种数不足3的样地,用
ifelse(is.na(top3), 0, top3)避免NA导致的判断错误
内容的提问来源于stack exchange,提问作者Richard Sample
相关产品推荐
相关产品推荐

