小明的数据分析笔记本 发表于 2024-7-29 20:27:13

python脚本更改vcf文件中的样本顺序

用vcf文件和表型关联做GWAS分析的时候通常会要求vcf文件里的样本顺序和表型样本顺序是一致的,一种做法是根据vcf文件里的样本顺序调整表型数据里的样本顺序,另外一种做法是根据表型数据里的样本顺序去调整vcf文件的样本顺序。

调整vcf文件的样本顺序没有找到现成的工具可以做这个事情,之前搜索找到一个链接说bcftools 的 reheader命令可以调整样本顺序,我自己之前也用这个命令做过。最近才发现这个命令不会更改样本的顺序,只是根据提供的样本名把vcf文件里的样本名改掉,基因型的顺序并不会动

比如vcf文件

!(data/attachment/forum/plugin_zhanmishu_markdown/202407/d756a8dfb4d224815c96976386353120_1722256020_8692.jpg)

运行bcftools reheader

```
bcftools reheader -s sample.order practice.recode.vcf
```

!(data/attachment/forum/plugin_zhanmishu_markdown/202407/444763a025267b4b1f16cb81072e4481_1722256019_6838.jpg)

## 自己写的python脚本

```
import sys


## list1 指定顺序的列表
## list2 需要调整顺序的列表
def find_positions(list1,list2):
    positions = []
    for element in list1:
      position = list2.index(element)
      positions.append(position + 9)
      
    return(list(range(9)) + positions)

## sys.argv 样本顺序文件,每行一个样本
## sys.argv 输入vcf
## sys.argv 输出vcf

sample_order_list = []

with open(sys.argv,'r') as fr:
    for line in fr:
      sample_order_list.append(line.strip())

fr = open(sys.argv,'r')
fw = open(sys.argv,'w')

for line in fr:
    if line.startswith("##"):
      fw.write(line)

    elif line.startswith("#CHROM"):
      raw_sample_order = line.strip().split()

      order_list = find_positions(sample_order_list,raw_sample_order)

      temp_list = line.strip().split()

      new_list = for i in order_list]

      fw.write("%s\n"%('\t'.join(new_list)))

    else:
      temp_list = line.strip().split()

      new_list = for i in order_list]

      fw.write("%s\n"%('\t'.join(new_list)))

fr.close()
fw.close()

```

运行命令

```
python adjustVCFsampleOrder.py sample.order practice.recode.vcf practice.reorder.vcf
```

**欢迎大家关注我的公众号**
**小明的数据分析笔记本**

> 小明的数据分析笔记本 公众号 主要分享:1、R语言和python做数据分析和数据可视化的简单小例子;2、园艺植物相关转录组学、基因组学、群体遗传学文献阅读笔记;3、生物信息学入门学习资料及自己的学习笔记!
>
页: [1]
查看完整版本: python脚本更改vcf文件中的样本顺序