Объединение двух файлов VCF с разными идентификаторами сэмплов и местоположениями
Добрый день,
Как объединить несколько файлов вызовов Variant (VCF) с разными темами?
Я несколько наборов данных VCF с разными sampleIds и местоположениями:
file1:
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 одинаковы в обоих файлах:
Ошибка при записи строк
Невозможно вывести идентификаторы образцов, потому что они не одинаковы в каждой строке.
Я подумываю создать фиктивную таблицу с NULL-вызовами для всех идентификаторов, но это кажется глупым. (Не говоря уже об огромном потреблении ресурсов.
Есть ли простой способ объединить файлы VCF с разными идентификаторами сэмплов? Или автозаполнение отсутствующих значений с помощью NULL-вызовов?
Изменить: мне удалось сделать это с форматом bigVCF. Однако он автоматически заполняет -1,-1 вызовы. Я хотел бы вручную установить значения автозаполнения как что-то более понятное, что это не "реально"
write.mode("overwrite").format("bigvcf").save(
1 ответ
Приведенный выше код работает, если у вас есть одинаковые варианты в обеих таблицах. Я бы не рекомендовал использовать его для объединения двух разных наборов данных, так как это приведет к пакетным эффектам.
Лучшая практика для объединения двух наборов данных - повторно обработать их из файлов BAM в gVCF, используя один и тот же конвейер. Затем запустите совместное генотипирование, чтобы объединить образцы (вместо настраиваемой функции spark-sql).
Databricks действительно предоставляет конвейер лучших практик GATK4, который включает совместное генотипирование. Или вы можете использовать вариант Deep для вызова мутаций.
Если невозможно повторно обработать данные, то два набора данных следует обрабатывать отдельно в метаанализе, а не объединять VCF и выполнять мега-анализ.