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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:35:25