使用tidyr::extract与正则转换.faa为数据框遇错求助
解决FASTA蛋白序列拆分为ID/名称/序列表格的正则错误问题
错误原因分析
你遇到的Error: regex should define 2 groups; 4 found.是因为:
- 正则捕获组数量与输出列不匹配:
tidyr::extract要求正则表达式的捕获组(()包裹的部分)数量和into参数指定的列数完全一致。你写的正则有4个捕获组,但into只定义了2列,导致不匹配报错。 - 正则与实际数据格式不匹配:你的序列名称格式是
[蛋白ID] [描述信息](比如NP_001007096.1 uncharacterized protein Dmel_CG42637, isoform C [Drosophila melanogaster]),但正则里写了\\|(竖线分隔符),完全不符合数据实际格式。
修正后的完整代码
以下代码可以正确将FASTA文件转换为包含protein_id(ID列)、description(名称列)、sequence(序列列)的表格:
library(Biostrings) library(dplyr) library(tidyr) # 下载并读取蛋白序列文件 url <- "https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/001/215/GCF_000001215.4_Release_6_plus_ISO1_MT/GCF_000001215.4_Release_6_plus_ISO1_MT_protein.faa.gz" destfile <- tempfile() download.file(url, destfile) fruitfly <- readAAStringSet(destfile) # 构建初始数据框,提取序列和完整名称 protein_df <- tibble( full_name = names(fruitfly), sequence = as.character(fruitfly) ) # 拆分完整名称为ID和描述列(按第一个空格拆分,保留描述中的空格) protein_df <- protein_df %>% separate(full_name, into = c("protein_id", "description"), sep = " ", extra = "merge") # 查看结果 head(protein_df)
可选:用extract实现拆分
如果你更倾向于用tidyr::extract,可以使用匹配第一个空格前后内容的正则,确保捕获组数量和列数一致:
protein_df <- protein_df %>% extract(full_name, into = c("protein_id", "description"), regex = "^([^ ]+) (.*)")
^([^ ]+):捕获第一个空格前的所有字符(即蛋白ID)(.*):捕获第一个空格后的所有内容(即蛋白名称和物种信息)
结果说明
执行后你会得到一个包含3列的数据框:
protein_id:蛋白的唯一标识符(如NP_001007096.1)description:蛋白的功能、亚型、物种等描述信息sequence:完整的蛋白质序列
内容的提问来源于stack exchange,提问作者Ayaz
相关产品推荐
相关产品推荐

