vcftools批量计算不同群体等位基因频率(非maf次等位基因频率),并合并成一个文件
本文最后更新于 195 天前,如有失效请评论区留言。

STEP1

主要使用到的代码分两部分,第一步脚本为shell脚本:Population_freq.sh ,可计算不同群体的等位基因频率,并生成单独文件。

需要准备的文件有两个,vcf文件以及群体分群文件

vcf_file=”186_filtered.LD.pruned.noContig.recode.vcf”
pop_file=”186sample.pop”

其中186sample.pop文件内容如下

脚本Population_freq.sh如下

#!/bin/bash

# 输入文件和目录
vcf_file="186_filtered.LD.pruned.noContig.recode.vcf"
pop_file="186sample.pop"

# 输出目录
output_dir="population_freq_results"
temp_dir="${output_dir}/temp_ids"

# 确保输出和临时目录存在
mkdir -p "$output_dir"
mkdir -p "$temp_dir"

# 从群体信息文件中提取独特的群体,并保存到一个临时文件
cut -f2 $pop_file | sort | uniq > "${temp_dir}/unique_groups.txt"

# 为每个独特的群体生成包含个体ID的文件
while read group; do
    grep "\b$group\b" $pop_file | awk '{print $1}' > "${temp_dir}/${group}.ids"
done < "${temp_dir}/unique_groups.txt"

# 使用vcftools处理每个群体
while read group; do
    (
        echo "处理群体:$group"
        # 使用vcftools计算等位基因频率
        vcftools --vcf $vcf_file --keep "${temp_dir}/${group}.ids" --freq --out "${output_dir}/${group}_population_freq"
        if [ $? -eq 0 ]; then
            echo "完成群体:$group"
        else
            echo "计算等位基因频率失败:$group"
        fi
    ) &
done < "${temp_dir}/unique_groups.txt"

wait

echo "所有群体处理完毕。"

最终生成的文件如下

单个文件内容如下

STEP2

第二步为python脚本:combine_population_freq.py,合并不同群体的等位基因频率的单独文件,并最终保存为一个,分隔的.csv文件和一个制表符分割的.txt文件(两个文件内容一样,仅格式不同)。

需要定义的路径有两个,上一步生成的.frq文件所在的路径以及最终合并后输出的文件名

# 输入目录和输出文件
input_dir = “/mnt/e/mwx/workspace/186sample/population_freq_results”
output_file = “combined_population_freq.csv”

combine_population_freq.py 内容如下

import os
import pandas as pd

# 输入目录和输出文件
input_dir = "/mnt/e/mwx/workspace/186sample/population_freq_results"
output_csv_file = "combined_population_freq.csv"
output_txt_file = "combined_population_freq.txt"

# 获取所有 .frq 文件的列表
frq_files = [f for f in os.listdir(input_dir) if f.endswith('.frq')]

# 初始化字典来存储所有SNP信息
snp_data = {}

# 处理每个 .frq 文件
for frq_file in frq_files:
    file_path = os.path.join(input_dir, frq_file)
    
    # 从文件名获取群体名称,并去掉 "_population_freq" 部分
    group_name = os.path.splitext(frq_file)[0].replace('_population_freq', '')
    
    with open(file_path, 'r') as f:
        lines = f.readlines()
    
    # 遍历文件中的每一行数据
    for line in lines[1:]:  # 跳过标题行
        parts = line.strip().split()
        snp = f"{parts[0]}:{parts[1]}"
        allele_freqs = parts[4:]  # 提取所有等位基因频率对
        
        # 提取第一个等位基因频率
        first_allele, first_freq = allele_freqs[0].split(':')
        
        if snp not in snp_data:
            # 初始化FREQ列为 "allele1/allele2" 的形式
            snp_data[snp] = {"FREQ": f"{first_allele}/{allele_freqs[1].split(':')[0]}"}
        
        # 存储每个群体的第一个等位基因频率
        snp_data[snp][group_name] = first_freq

# 初始化 DataFrame 并写入表头
columns = ["SNP", "FREQ"] + [os.path.splitext(f)[0].replace('_population_freq', '') for f in frq_files]
df_list = []

# 填充 DataFrame
for snp, freqs in snp_data.items():
    row = {"SNP": snp, "FREQ": freqs["FREQ"]}
    for group_name in columns[2:]:
        row[group_name] = freqs.get(group_name, "NA")
    df_list.append(row)

df = pd.DataFrame(df_list, columns=columns)

# 保存结果到 CSV 文件
df.to_csv(output_csv_file, index=False)

# 保存结果到制表符分隔的 TXT 文件
df.to_csv(output_txt_file, sep='\t', index=False)

print(f"合并完成,结果保存在 {output_csv_file} 和 {output_txt_file}")

最终combined_population_freq.txt文件内容如下

最终combined_population_freq.csv文件内容如下

版权声明:除特殊说明,博客文章均为Vensin原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。 如有需要,请至学习地图系统学习本博客的教程。 | 博客订阅:RSS | 广告招租:留言板 | 博客 |
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
# # #