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

使用tidyverse为同物种名称补全作者标注的实现方案咨询

基于tidyverse的实现方案

核心思路是先构建「物种基础名(属名+种加词,不含作者)- 带作者的完整物种名」的映射表,再通过基础名匹配回填到所有对应行。

完整代码

library(tidyverse)

# 示例数据构造
df <- data.frame(name1 = c("Acer laurinum", NA, "Acmella paniculata", "Aglaia lawii", NA),
                 name2 = c(NA, "Acer laurinum Hassk.", NA, NA, "Aglaia lawii (Wight)"),
                 name3 = c("Acer laurinum", "Acer laurinum Hassk.", "Acmella paniculata", "Aglaia lawii", "Aglaia lawii (Wight)"))

# 1. 构建物种映射表
species_lookup <- df %>%
  # 提取所有带作者标注的物种行
  filter(!is.na(name2)) %>%
  # 提取物种基础名(属名+种加词),如果存在种下等级可调整正则规则
  mutate(species_base = str_extract(name2, "^[A-Z][a-z]+ [a-z]+")) %>%
  select(species_base, full_name = name2)

# 2. 回填完整名称到name3列
df_result <- df %>%
  mutate(species_base = str_extract(name3, "^[A-Z][a-z]+ [a-z]+")) %>%
  left_join(species_lookup, by = "species_base") %>%
  # 匹配到完整名用完整名,没匹配到保留原name3值
  mutate(name3 = coalesce(full_name, name3)) %>%
  # 移除辅助计算列
  select(-species_base, -full_name)

输出结果验证

print(df_result)
#                name1                name2                  name3
# 1      Acer laurinum                 <NA>    Acer laurinum Hassk.
# 2               <NA> Acer laurinum Hassk.    Acer laurinum Hassk.
# 3 Acmella paniculata                 <NA>     Acmella paniculata
# 4       Aglaia lawii                 <NA> Aglaia lawii (Wight)
# 5               <NA> Aglaia lawii (Wight) Aglaia lawii (Wight)

规则扩展说明

如果你的数据存在亚种、变种等种下等级,只需要调整str_extract中的正则即可,比如兼容变种/亚种的正则如下:

str_extract(name, "^[A-Z][a-z]+ [a-z]+(?: (?:subsp\\.|var\\.|f\\.) [a-z]+)?")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:15:02