使用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
相关产品推荐
相关产品推荐

