如何基于部分属名匹配合并植物数据集?
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
相关产品推荐
相关产品推荐

