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

如何按两列依次左连接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:20:34