关于统一多来源物种名称的技术咨询
关于统一多来源物种名称的技术咨询
嘿,我明白你现在的困扰——从不同来源收集的物种名称格式太乱了,同一物种有好几种写法,得统一成标准名对吧?结合你给的示例数据,我给你整理了几个在R里能快速解决的方案:
先确认你的原始数据
你提供的数据集结构是这样的:
dat <- structure(list( Species = c("A. thaliana","Arabidopsis.thaliana","ARABIDOPSIS Thaliana", "Pisum.sativum","P. Sativum","PISUM SATIVUM", "B. Vulgaris","BETA VULGARIS","Beta.vulgaris", "Secale.cereale","S. CEREALE","SECALE CEREALE"), Position = c("C1","C2","C3","D1","D2","D3","F1","F2","F3","G1","G2","G3") )) dat <- data.frame(dat)
解决方案1:用正则表达式批量匹配(推荐,扩展性强)
这种方法不用逐个枚举所有变体,通过忽略大小写的正则匹配,自动把同一物种的不同写法映射到你指定的标准名:
library(dplyr) dat_cleaned <- dat %>% mutate(Standard_Species = case_when( # 匹配所有拟南芥的变体(不管大小写、缩写) grepl("arabidopsis|A\\. thaliana", Species, ignore.case = TRUE) ~ "Arabidopsis.thaliana", # 匹配所有豌豆的变体 grepl("pisum|P\\. Sativum", Species, ignore.case = TRUE) ~ "Pisum.sativum", # 匹配所有甜菜的变体 grepl("beta|B\\. Vulgaris", Species, ignore.case = TRUE) ~ "Beta.vulgaris", # 匹配所有黑麦的变体 grepl("secale|S\\. CEREALE", Species, ignore.case = TRUE) ~ "Secale.cereale", # 兜底:如果遇到未匹配的新物种,保留原名称 TRUE ~ Species )) # 查看清洗后的结果 print(dat_cleaned)
运行后你会看到所有同物种的名称都统一成了你指定的标准格式,比如C1、C3的拟南芥都会变成Arabidopsis.thaliana。
解决方案2:创建精确映射字典(适合严格控制标准名的场景)
如果你已经明确知道每个变体对应的标准名,可以先做一个映射字典,直接替换:
# 创建物种名称映射字典,键是原始变体,值是标准名 species_mapping <- c( "A. thaliana" = "Arabidopsis.thaliana", "ARABIDOPSIS Thaliana" = "Arabidopsis.thaliana", "P. Sativum" = "Pisum.sativum", "PISUM SATIVUM" = "Pisum.sativum", "B. Vulgaris" = "Beta.vulgaris", "BETA VULGARIS" = "Beta.vulgaris", "S. CEREALE" = "Secale.cereale", "SECALE CEREALE" = "Secale.cereale" ) # 替换原物种名称,已经是标准名的会自动保留(因为字典里没有对应的键,返回NA,用ifelse处理) dat$Standard_Species <- ifelse(is.na(species_mapping[dat$Species]), dat$Species, species_mapping[dat$Species]) # 查看结果 print(dat)
额外小贴士
如果你的物种数量非常多,或者需要更专业的分类学标准化,可以试试R的生物信息学专用包taxize——它能调用NCBI、GBIF等权威数据库,自动匹配并校正物种名称,还能补充分类学层级信息,非常实用。
备注:内容来源于stack exchange,提问作者SAL
相关产品推荐
相关产品推荐

