如何在R中基于三列物种名匹配为数据集添加IOCSpecies列?
解决方案
你的问题核心是Names数据集是宽格式(多个别名列对应一个标准名称),没法直接用merge匹配。解决思路是先把它转成长格式的键值对映射表,再和Dataset合并,具体步骤如下:
1. 加载工具包
用tidyverse里的tidyr做格式转换,dplyr做合并操作:
library(tidyverse)
2. 转换映射表格式
把Names里所有的binSpeciesX列合并成一列别名,对应到各自的IOCSpecies:
# 转成长格式,所有binSpecies列统一放到alias列 name_mapping <- Names %>% pivot_longer( cols = starts_with("binSpecies"), # 匹配所有以binSpecies开头的列 names_to = "alias_type", # 可选,保留原列名标记,不需要可以删掉 values_to = "alias" # 别名列,用来和Dataset的binSpecies匹配 ) %>% select(IOCSpecies, alias) # 只保留需要的两列
转换后的name_mapping结构如下:
# A tibble: 12 × 2 IOCSpecies alias <chr> <chr> 1 Canine Dog 2 Canine Perro 3 Canine Chienne 4 Feline Cat 5 Feline Gato 6 Feline Chatte 7 Equine Horse 8 Equine Caballo 9 Equine Jument 10 Avian Bird 11 Avian Pajaro 12 Avian Oiseau
3. 合并数据集
用left_join把Dataset和转换后的映射表匹配,自动把每个binSpecies对应到标准的IOCSpecies:
# 按binSpecies和alias匹配,添加IOCSpecies列 Dataset_with_IOC <- Dataset %>% left_join(name_mapping, by = c("binSpecies" = "alias"))
运行后你的Dataset_with_IOC结果如下:
IndivID binSpecies IOCSpecies 1 1 Dog Canine 2 2 Gato Feline 3 3 Canine Canine 4 4 Chienne Canine 5 5 Jument Equine 6 6 Avian Avian 7 7 Caballo Equine 8 8 Dog Canine 9 9 Cat Feline 10 10 Gato Feline
额外说明
- 如果
Dataset里存在无法匹配的binSpecies,IOCSpecies列会显示NA,你可以用filter(is.na(IOCSpecies))找出这些记录,再补充映射规则。 - 不管你有多少个
IOCSpecies或者多少个别名列,pivot_longer都会自动处理,完全适配大规模数据(50万条记录也没问题,效率足够)。
内容的提问来源于stack exchange,提问作者JatNTU
相关产品推荐
相关产品推荐

