You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:55:19