结合两个具有不同 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,仅结合两个具有不同值的表(仅基于三个字段,而不是整行)