如何在R语言数据框中去除基因ID编号,仅保留基因名称
解决R语言数据框中提取基因名称的问题
你的需求是从以|分隔的基因ID中提取最后一段作为基因名称,替换原数据框的gene列。由于每个ID的长度不固定,substr()函数因为需要指定固定的起始/结束位置,并不适合这个场景。下面提供几种更通用的实现方法:
先构造示例数据框
首先还原你提供的原始数据:
df <- data.frame( gene = c("gb|ADZ12699.1|ARO:3005091|RanA", "gb|AAV85982.1|ARO:3000535|macB", "gb|APB03214.1|ARO:3003980|tetA(58)"), n = c(21, 19, 17), freq = c(7.1917808, 6.5068493, 5.8219178), stringsAsFactors = FALSE )
方法1:基础R的sub()函数(正则表达式)
利用正则表达式匹配最后一个|之后的所有内容,是最简洁的基础R实现:
df$gene <- sub(".*\\|(.*)", "\\1", df$gene)
- 正则说明:
.*\\|会贪婪匹配到最后一个|(包括|)的所有内容;(.*)捕获最后一个|之后的所有字符作为分组1;替换时用\\1提取这个分组的内容。
方法2:strsplit()分割后取最后元素
通过strsplit()按|分割字符串,再提取每个分割结果的最后一个元素:
df$gene <- sapply(strsplit(df$gene, "\\|"), tail, n = 1)
strsplit()会把每个ID拆分成字符串列表,sapply()遍历列表,用tail(1)取出每个列表的最后一项。
方法3:tidyverse + stringr包(更直观)
如果你习惯用tidyverse生态,stringr包提供了更易读的函数:
library(stringr) # 方法3.1:提取最后一段非|的内容 df$gene <- str_extract(df$gene, "[^\\|]+$") # 方法3.2:直接取分隔后的最后一个"词" df$gene <- word(df$gene, -1, sep = "\\|")
[^\\|]+$匹配字符串末尾连续的非|字符;word()函数可以直接指定分隔符,用-1表示取最后一个分段。
处理后的结果
执行任意一种方法后,数据框会变为你期望的形式:
print(df) #> gene n freq #> 1 RanA 21 7.1917808 #> 2 macB 19 6.5068493 #> 3 tetA(58) 17 5.8219178
内容的提问来源于stack exchange,提问作者minKN
相关产品推荐
相关产品推荐

