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

使用tidyr::extract与正则转换.faa为数据框遇错求助

解决FASTA蛋白序列拆分为ID/名称/序列表格的正则错误问题

错误原因分析

你遇到的Error: regex should define 2 groups; 4 found.是因为:

  1. 正则捕获组数量与输出列不匹配:tidyr::extract要求正则表达式的捕获组(()包裹的部分)数量和into参数指定的列数完全一致。你写的正则有4个捕获组,但into只定义了2列,导致不匹配报错。
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:35:19