结合两个具有不同 sampleId 和位置的 VCF 文件

Posted

技术标签:

【中文标题】结合两个具有不同 sampleId 和位置的 VCF 文件【英文标题】:Combining two VCF files with differing sampleIds and locations 【发布时间】:2021-09-30 10:40:43 【问题描述】:

早安,

如何将不同主题的多个变体调用文件 (VCF) 组合起来?

我有多个具有不同 sampleId 和位置的 VCF 数据集:

文件1:

contigName |start | end  | names | referenceAllele | alternateAlleles| qual| filters| splitFromMultiAllelic| genotypes
1          |792460|792461|["bla"]|G                |["A"]            |null|["PASS"] |false      | ["sampleId": "abba", "phased": false, "calls": [0, 0]]
1          |792461|792462|["blaA"]|G                |["A"]            |null|["PASS"] |false      | ["sampleId": "abba", "phased": false, "calls": [0, 0]]

文件2:

contigName |start | end  | names | referenceAllele | alternateAlleles| qual| filters| splitFromMultiAllelic| genotypes
1          |792460|792461|["bla"]|G                |["A"]            |null|["PASS"] |false      | ["sampleId": "baab", "phased": false, "calls": [0, 0]]
1          |792464|792465|["blaB"]|G                |["A"]            |null|["PASS"] |false      | ["sampleId": "baab", "phased": false, "calls": [0, 0]]

我需要将这些组合成单个 VCF 文件。由于数据安全,我需要在 DataBricks (pyspark/scala) 环境中工作。

Glow 文档有和想法,我模仿了:

import pyspark.sql.functions as F
spark.read.format("vcf")\
  .option("flattenInfoFields", True)\
  .load(file_list)\
  .groupBy('contigName', 'start', 'end', 'referenceAllele', 'alternateAlleles', 'qual', 'filters','splitFromMultiAllelic')\
  .agg(F.sort_array(F.flatten(F.collect_list('genotypes'))).alias('genotypes'))\
  .write.mode("overwrite").format("vcf").save(.my_output_destination ) 

这仅在两个文件中的 sampleId 相同时才有效:

写入行时任务失败

无法推断样本 ID,因为它们在每一行中都不相同。

我正在考虑为所有 ID 创建带有 NULL 调用的虚拟表,但这似乎很愚蠢。 (更不用说巨大的资源汇了。

有没有简单的方法来组合具有不同 sampleId 的 VCF 文件?还是使用 NULL 调用自动填充缺失值?

编辑:我设法用 bigVCF 格式做到了这一点。但是它会自动填充 -1,-1 调用。我想手动设置自动填充的值,因为它不是“真实的”

write.mode("overwrite").format("bigvcf").save(

【问题讨论】:

【参考方案1】:

如果您在两个表中都有相同的变体,则上述代码有效。我不建议使用它来组合两个不同的数据集,因为这会引入批处理效果。

合并两个数据集的最佳做法是使用相同的管道将它们从 BAM 文件重新处理为 gVCF。然后运行联合基因分型来合并样本(而不是自定义 spark-sql 函数)。

Databricks 确实提供了一个 GATK4 最佳实践管道,其中包括联合基因分型。或者您可以使用 Deep 变体来调用突变。

如果无法重新处理数据,则应在元分析中分别处理这两个数据集,而不是合并 VCF 并执行大型分析。

【讨论】:

以上是关于结合两个具有不同 sampleId 和位置的 VCF 文件的主要内容,如果未能解决你的问题,请参考以下文章

SQL,仅结合两个具有不同值的表(仅基于三个字段,而不是整行)

沉溺于虚无之海

结合两个不同文件的淘汰模型

如果在同一位置有两个具有两种不同颜色的顶点,片段会得到啥颜色?

从行组合中查找重复项

连接两个具有相同键但不同字段的表