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

如何基于部分属名匹配合并植物数据集?

R语言实现多属候选数据集与物种信息数据集的匹配合并

核心思路

  • 拆分df1中SPP列的多属候选,得到单独的属名
  • 将拆分后的属名与df2中的属名匹配,关联功能型等信息
  • 根据需求将匹配后的信息合并回原df1的结构

具体实现步骤(使用tidyverse包)

1. 加载必要的包

tidyverse包含数据处理常用的dplyr、tidyr等工具,语法简洁适合新手:

library(tidyverse)

2. 替换为你的真实数据集(先看示例逻辑)

先模拟两个数据集帮你理解代码:

# df1:包含多属候选的数据集
df1 <- tibble(
  ID = c(1, 2, 3),
  SPP = c("Poa OR Festuca", "Quercus", "Acer OR Betula OR Salix")
)

# df2:包含物种属名及功能信息的数据集
df2 <- tibble(
  Genus = c("Poa", "Festuca", "Quercus", "Acer", "Betula", "Salix"),
  Functional_Type = c("Grass", "Grass", "Tree", "Tree", "Tree", "Shrub"),
  Life_History = c("Perennial", "Perennial", "Perennial", "Perennial", "Perennial", "Perennial"),
  Origin = c("Native", "Introduced", "Native", "Native", "Introduced", "Native")
)

3. 拆分df1的多属候选列

用separate_rows()把SPP列中OR分隔的属名拆成单独行:

df1_split <- df1 %>%
  separate_rows(SPP, sep = " OR ") %>%  # 按" OR "拆分每行的属名
  rename(Genus = SPP)  # 重命名列名,方便和df2的Genus列匹配

4. 匹配并合并df2的信息

用left_join()按属名关联两个数据集,保留df1的所有行:

merged_temp <- df1_split %>%
  left_join(df2, by = "Genus")

5. 合并回原df1的结构(可选)

如果要保持df1原有行数,把同一ID对应的多属信息汇总(比如用逗号分隔多个值):

final_df <- merged_temp %>%
  group_by(ID) %>%
  summarize(
    Original_SPP = first(SPP),  # 保留原始的多属候选文本
    Functional_Types = str_c(unique(Functional_Type), collapse = ", "),  # 合并功能型
    Life_Histories = str_c(unique(Life_History), collapse = ", "),  # 合并生活史
    Origins = str_c(unique(Origin), collapse = ", ")  # 合并起源信息
  ) %>%
  ungroup()

注意事项

  • 如果df1和df2的属名大小写不一致,先统一转换避免匹配失败:
    # 统一转换为小写
    df1_split <- df1_split %>% mutate(Genus = tolower(Genus))
    df2 <- df2 %>% mutate(Genus = tolower(Genus))
    
  • 若不需要合并信息,直接用merged_temp即可,它会保留每个属对应的单独行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:50:47