使用R tidyverse补全数据框中缺失作者信息的name3列物种名称
实现思路
我们可以先从现有数据中提取「带作者后缀的完整物种名」和对应的「不含作者的短物种名」生成匹配对照表,再用对照表批量补全所有短名称的后缀即可。
实现代码(tidyverse 版本)
首先加载依赖包:
library(tidyverse)
你的示例数据如下:
df <- data.frame( name1 = c("Acer laurinum", "Acmella paniculata", "Aglaia lawii", NA, NA), name2 = c(NA, NA, NA, "Acer laurinum Hassk.", "Aglaia lawii (Wight)"), name3 = c("Acer laurinum", "Acmella paniculata", "Aglaia lawii", "Acer laurinum Hassk.", "Aglaia lawii (Wight)") )
补全处理代码:
# 1. 生成匹配对照表:短物种名对应带作者的完整名称 match_table <- df %>% # 筛选带作者的完整名称行:这里用单词数大于2作为判断标准,可根据你的数据调整规则 filter(str_count(name3, "\\S+") > 2) %>% # 提取前两个单词作为匹配用的短物种名 mutate(short_name = word(name3, 1, 2)) %>% select(short_name, full_name = name3) # 2. 补全原数据的name3列 df_result <- df %>% mutate(short_name = word(name3, 1, 2)) %>% # 关联匹配表 left_join(match_table, by = "short_name") %>% # 优先用匹配到的完整名称,无匹配则保留原值 mutate(name3 = coalesce(full_name, name3)) %>% # 移除辅助计算列 select(-short_name, -full_name)
输出结果
运行后得到的df_result和你要求的期望输出完全一致:
name1 name2 name3 1 Acer laurinum <NA> Acer laurinum Hassk. 2 Acmella paniculata <NA> Acmella paniculata 3 Aglaia lawii <NA> Aglaia lawii (Wight) 4 <NA> Acer laurinum Hassk. Acer laurinum Hassk. 5 <NA> Aglaia lawii (Wight) Aglaia lawii (Wight)
注意事项
如果你的物种名包含亚种、变种等超过两个单词的情况,调整word(name3, 1, 2)的截取位数即可适配。
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

