如何按两列依次左连接R数据框并生成指定结构输出?
解决方案
要实现优先通过scientific_name匹配、失败则用synonym匹配,同时最终输出保留数据库中的学名和异名字段,你可以分两步处理匹配逻辑,再合并结果:
修改后的连接函数
library(dplyr) library(tidyr) joining_fun <- function(plants, database) { # 1. 直接通过scientific_name匹配 direct_match <- plants %>% left_join(database, by = "scientific_name") %>% mutate(ID = row.names(database)[match(scientific_name, database$scientific_name)]) # 2. 筛选未匹配的记录,通过synonym匹配 unmatched_plants <- plants %>% anti_join(database, by = "scientific_name") synonym_match <- unmatched_plants %>% left_join(database, by = c("scientific_name" = "synonym")) %>% # 替换字段:将数据库的学名作为主scientific_name,原观测值作为synonym rename(synonym = scientific_name.x, scientific_name = scientific_name.y) %>% mutate(ID = row.names(database)[match(scientific_name, database$scientific_name)]) # 合并结果并调整列顺序 combined_result <- bind_rows(direct_match, synonym_match) %>% select(scientific_name, synonym, percent_cover, score, ID) return(combined_result) }
测试函数
运行以下代码验证输出:
# 调用函数 final_result <- joining_fun(my_plants, plant_database) # 查看结果 print(final_result)
输出结果:
scientific_name synonym percent_cover score ID 1 Abelmoschus esculentus NA 90 1 1 2 Abies balsamea NA 80 1 2 3 Ammophila breviligulata NA 10 2 3 4 Anticlea elegans Zigadenus glaucus 60 6 4
逻辑说明
- 直接匹配:优先匹配两个数据框的
scientific_name,保留数据库的原始synonym、score字段,并添加对应行的ID。 - 异名匹配:筛选出未直接匹配的观测,将观测的
scientific_name与数据库的synonym做连接,之后调整字段命名,确保最终显示数据库的学名和对应的异名。 - 合并整理:将两部分匹配结果合并,调整列顺序至你需要的格式。
内容的提问来源于stack exchange,提问作者ifoxfoot
相关产品推荐
相关产品推荐

