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

将VCF文件INFO列CSQ字段拆分至表格格式的技术需求

解决VCF中CSQ字段多转录本信息合并问题

针对你遇到的VCF文件CSQ字段多转录本信息无法全部保留、仅能提取首个转录本的问题,这里提供两种可行方案:

方案一:使用bcftools +split-vep(调整参数实现多转录本合并)

默认的bcftools +split-vep确实只保留首个转录本,但通过添加--merge comma参数,可以将同一变异下多个转录本的同字段值用逗号合并。

前提

确保你的VCF文件Header中包含CSQ字段的格式定义(VEP输出的VCF默认自带),例如:

##INFO=<ID=CSQ,Number=.,Type=String,Description="Consequence annotations from Ensembl VEP. Format: Allele|Consequence|...">

执行命令

bcftools +split-vep input.vcf \
  -O t \
  -o output.tsv \
  --merge comma \
  --fields CSQ \
  --rename '%CHROM,%POS,%ID,%REF,%ALT,%QUAL,%FILTER,'%CSQ

参数说明:

  • -O t:输出TSV格式(方便查看和后续处理,若需VCF格式可改为-O v)
  • --merge comma:指定多个转录本的同字段值用逗号连接
  • --fields CSQ:明确拆分INFO中的CSQ字段
  • --rename:定义输出列顺序,包含7个固定列和CSQ的82个子字段

方案二:Python脚本自定义处理(灵活适配特殊场景)

如果工具参数无法满足需求,可通过Python脚本手动解析并合并CSQ字段,这里用cyvcf2库(高效处理VCF)实现:

步骤1:安装依赖

pip install cyvcf2

步骤2:执行脚本

import cyvcf2

# 从VCF Header读取CSQ的子字段列表
vcf = cyvcf2.VCF("input.vcf")
csq_desc = next(h for h in vcf.headers if 'ID=CSQ' in h)
csq_fields = csq_desc.split('Format: ')[1].rstrip('">').split('|')

# 定义输出表头
output_cols = ['Chromosome', 'Position', 'ID', 'Ref', 'Alt', 'Qual', 'Filter'] + csq_fields

# 写入输出TSV
with open('output.tsv', 'w') as out_file:
    out_file.write('\t'.join(output_cols) + '\n')
    for var in vcf:
        # 提取固定列数据,处理空值
        chrom = var.CHROM
        pos = str(var.POS)
        var_id = var.ID if var.ID else '.'
        ref = var.REF
        alt = ','.join(var.ALT)
        qual = str(var.QUAL) if var.QUAL is not None else '.'
        filt = ','.join(var.FILTER) if var.FILTER else '.'
        
        # 解析CSQ字段
        csq_raw = var.INFO.get('CSQ')
        if not csq_raw:
            # 无CSQ数据时填充空值
            row = [chrom, pos, var_id, ref, alt, qual, filt] + ['']*len(csq_fields)
            out_file.write('\t'.join(row) + '\n')
            continue
        
        # 拆分所有转录本的CSQ数据
        transcript_list = [t.split('|') for t in csq_raw.split(',')]
        # 按子字段合并,仅保留非空值并用逗号连接
        merged_csq = []
        for idx in range(len(csq_fields)):
            values = [t[idx] for t in transcript_list if t[idx]]
            merged_csq.append(','.join(values) if values else '')
        
        # 组装行并写入
        final_row = [chrom, pos, var_id, ref, alt, qual, filt] + merged_csq
        out_file.write('\t'.join(final_row) + '\n')

脚本说明

  • 自动从VCF Header读取CSQ的82个子字段定义,无需手动输入
  • 处理空值时遵循VCF规范,用.表示缺失数据
  • 合并时自动过滤子字段的空值,仅保留有效信息

内容的提问来源于stack exchange,提问作者sunderv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:23:22