每天跑生信流程,最让人崩溃的往往不是复杂的统计算法,而是数据清洗。 比如,你刚从数据库下载了一批序列,打开一看,名字全长这样:
>ENSSSCP00000012345.1 pep chromosome:Sscrofa11.1:1:1000:2000:1但你后续的分析软件只认ENSSSCP00000012345这个纯净的 ID。如果你还在把数据导进 Excel,用“分列”或者“查找替换”来搞定,那一旦遇到成千上万条序列,绝对会点鼠标点到手软。 今天,带你拿下 R 语言中最优雅的字符串处理神包——stringr。配合一点点最基础的正则表达式 (Regex),让你从此拥有批量处理文本的超能力。
许多朋友们在文章发送后不能第一时间接收到相关通知,强烈建议您将我们公众号设置为星标,步骤为 :进入公众号BioGenius班主页→点击右上角三个点→下方第一个选项就是“设置星标”。
stringr 是 tidyverse 家族的一员,它的函数极其好记,全都是以 str_ 开头的。
要让 stringr 发挥最大威力,我们需要懂一点点**正则表达式 (Regular Expression)**。别怕,生信日常处理中,你只需要记住下面这几个“密码”就够用了:
. :代表任意单个字符。.* :代表任意一串字符(最常用的万能匹配)。\\d+ :代表一个或多个连续的数字(digit)。^ :代表字符串的开头。$ :代表字符串的结尾。掌握了这几个符号,我们直接进入实战!
str_remove / str_replace)痛点: 拿到一个表达矩阵,列名全带着冗余的物种前缀,比如 Sus_scrofa_GeneA, Sus_scrofa_GeneB。怎么批量去掉前缀?
口诀: 定位它,删掉它。
# 加载神包
# install.packages("stringr")
library(stringr)
# 模拟冗余的基因名
messy_names <- c("Sus_scrofa_TP53", "Sus_scrofa_MYC", "Sus_scrofa_BRCA1")
# 施展魔法:批量删除 "Sus_scrofa_"
clean_names <- str_remove(messy_names, pattern = "Sus_scrofa_")
print(clean_names)
# 结果: "TP53", "MYC", "BRCA1"
如果你想把 Sus_scrofa 替换成简写 Pig,只需换成 str_replace():
str_replace(messy_names, pattern = "Sus_scrofa_", replacement = "Pig_")
# 结果: "Pig_TP53", "Pig_MYC", "Pig_BRCA1"
str_extract)痛点: 读入了一份 GFF/GTF 注释文件,第九列 (Attributes) 是一大串黏糊糊的信息:"gene_id=ENSSSCG00000012345;transcript_id=ENSSSCT00000054321;gene_name=TP53"我只想把 ENSSSCG 开头的基因 ID 抠出来!
口诀: 描述它的长相,把它抓出来。
# 模拟一段复杂的注释文本
gff_attr <- c(
"gene_id=ENSSSCG00000012345;transcript_id=ENSSSCT00000054321",
"gene_id=ENSSSCG00000067890;gene_name=MYC"
)
# 施展魔法:利用正则表达式提取
# 逻辑:我们要找的是 "ENSSSCG" 加上后面连续的数字 (\\d+)
gene_ids <- str_extract(gff_attr, pattern = "ENSSSCG\\d+")
print(gene_ids)
# 结果: "ENSSSCG00000012345", "ENSSSCG00000067890"
这行代码直接省去了你写十几个循环和字符串分割的麻烦,极其清爽!
str_pad)痛点: 染色体排序时,因为是按字符排序,经常会出现 chr1, chr10, chr11, ..., chr2, chr3 这种反人类的顺序。我们需要把 chr1 变成 chr01。
口诀: 设定固定长度,不够的用 0 补齐。
# 模拟 1 到 12 号染色体
chromosomes <- paste0("chr", 1:12)
print("原本的顺序极其容易排错:")
print(chromosomes)
# 1. 先用 str_extract 把数字抠出来 (\\d+ 代表提取连续数字)
chr_nums <- str_extract(chromosomes, "\\d+")
# 2. 用 str_pad 把数字补齐为 2 位,左边用 "0" 填充
padded_nums <- str_pad(chr_nums, width = 2, side = "left", pad = "0")
# 3. 重新拼装
clean_chromosomes <- paste0("chr", padded_nums)
print("强迫症极度舒适的对齐效果:")
print(clean_chromosomes)
# 结果: "chr01" "chr02" "chr03" ... "chr12"学会 stringr 包,就像给你的 R 语言装上了一把精准的手术刀。 那些曾经让你在 Excel 里耗费一整个下午的“文本清理”工作,现在只需要两三行代码就能批量搞定。这不仅是为了节省时间,更是为了让你的数据处理流程实现100% 的可重复性。 别再怕正则表达式了,从今天起,把它变成你生信武器库里最锋利的那把刀!
下期内容:merge
此文是在自己的理解和参考网络资料后完成的,若有侵权,请联系删除。

END

加我微信拉你进交流群/VIP群。

——往期推荐——
MetaboAnalyst 6.0代谢组学数据分析超详细教程 | 小白也能轻松上手!
Adobe Illustrator(AI)科研组图排版 | 保姆级教程(内附安装包)
投稿经验 | Frontiers in Microbiology
干货 | RNA-seq之R语言富集分析,KEGG、GO和GSEA实战详解
如果对您有帮助,请帮我们点一个在看,或者转发关注哦~这对我们真的很重要