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

R语言中按区域分组统计独特属与物种的特殊规则实现

解决带有特殊规则的物种/属统计问题

这个需求确实需要抠细节,我帮你梳理出清晰的解决思路和可直接运行的代码:

核心逻辑拆解

我们需要针对每个region,区分两种单独属名的情况:

  • 若该属存在带种加词的完整物种条目 → 单独属名不计入物种统计
  • 若该属没有任何完整物种条目 → 单独属名需要计入物种统计

下面用dplyr提供两种实现方式,按需选择:


方法一:分步标记+筛选(直观易懂,便于调试)

这种方式通过辅助列逐步标记需要排除的条目,逻辑清晰,新手也能快速理解:

library(dplyr)
library(stringr) # 用于字符串拆分判断

df_result <- df %>%
  group_by(region) %>%
  # 1. 标记当前spp是否是带种加词的完整物种(属名匹配且有空格分隔)
  mutate(is_full_species = str_detect(spp, " ") & str_extract(spp, "^[A-Za-z]+") == genus) %>%
  # 2. 判断当前条目所属的属,在本区域是否存在至少一个完整物种
  mutate(genus_has_full_species = any(is_full_species[genus == cur_data()$genus])) %>%
  # 3. 筛选符合统计规则的条目:
  #    要么不是单独属名,要么是单独属名但该属无完整物种
  filter(!(spp == genus & genus_has_full_species)) %>%
  # 4. 最终统计结果
  summarise(
    uniq_genus = n_distinct(genus),
    uniq_spp = n_distinct(spp)
  )

代码细节解释:

  • is_full_species:用str_detect检测空格判断是否带种加词,再用str_extract提取spp首单词,确认和genus匹配,标记为完整物种。
  • genus_has_full_species:针对每个条目,检查同区域内同属的条目是否存在完整物种,生成全局标记。
  • filter:精准排除「是单独属名且该属已有完整物种」的条目,剩下的就是符合规则的物种。

方法二:直接在汇总时计算(简洁高效)

如果不想生成中间辅助列,可以直接在summarise里完成逻辑判断,代码更紧凑:

library(dplyr)
library(stringr)

df_result <- df %>%
  group_by(region) %>%
  summarise(
    uniq_genus = n_distinct(genus),
    # 先找出本区域内需要排除的单独属名:即该属存在完整物种条目
    excluded_genus = unique(genus[str_detect(spp, " ") & str_extract(spp, "^[A-Za-z]+") == genus]),
    # 统计物种时,排除掉这些单独的属名
    uniq_spp = n_distinct(spp[!spp %in% excluded_genus])
  )

结果验证

运行代码后会得到符合规则的统计结果:

  • fom区域:单独的"B"被排除,uniq_spp为4("B b"、"B c"、"A c"、"C c")
  • fed区域:单独的"E"被保留,uniq_spp为4("E"、"B a"、"B b"、"A a")
  • fod区域:无需要排除的条目,uniq_spp为4(与常规统计结果一致)

内容的提问来源于stack exchange,提问作者hiperhiper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:49:05