组学学习

GWAS提取显著位点信息

2023-12-15  本文已影响0人  花生学生信

提取位点,要确定显著SNP上下游多长,来查找基因,这就需要计算LD衰减距离:LD衰减图绘制,然后根据上下游去和gff文件合并,把区间内的基因找到,这就找到目标基因了。

下面,用一个例子,来介绍一下操作的方法:

需要基因注释信息,SNP位点信息

对于SV,要先计算SV覆盖的范围:
计算vcf文件中SV的长度 - 简书 (jianshu.com)

###第一列为染色体,第三列为类型,第四五列为起止位置,如果第三列类型为gene,则打印染色体,起止位置
use strict;
open IN,"<$ARGV[0]";


open OU,">$ARGV[1]";
while(<IN>){
    chomp;
    my @vcf=split/\t/;
    if ($vcf[2] eq 'gene') {
        print OU join("\t", $vcf[0], $vcf[3], $vcf[4]), $vcf[8]"\n";
    }
}

close IN;
close OU;
D_GW nip.ge

使用bedtools提取信息

bedtools intersect -a D_GW -b nip.ge -loj >dgw
以下是一个Python脚本,用于从命令行中传入文件名,并提取读取文件中第七列以"ID=gene:"开头的内容,并截取第一个":"之前的字符,并去重:

```python
import re
import sys

# 从命令行获取文件名
filename = sys.argv[1]

# 读取文件内容
with open(filename, 'r') as file:
    lines = file.readlines()

# 提取第七列ID=gene:后面及第一个;前面的字符
result = set()
for line in lines:
    columns = line.split('\t')
    if len(columns) >= 7:
        match = re.search(r'ID=gene:(.*?);', columns[6])
        if match:
            result.add(match.group(1))

# 输出结果
for item in result:
    print(item)
匹配的结果信息,-1表示没有匹配

下面的脚本可以合并当前目录下所有的csv文件并打印三列数据

import os
import csv

output_file = "merged_file.txt"  # 新文件名
output_data = []  # 存储合并后的数据

# 遍历当前目录下的所有CSV文件
for file in os.listdir():
    if file.endswith(".csv"):
        with open(file, "r") as csv_file:
            csv_reader = csv.reader(csv_file)
            for row in csv_reader:
                if len(row) >= 3:  # 确保至少有三列数据
                    # 提取第二列、第三列、第三列,并使用制表符进行分割
                    new_row = "\t".join([row[1], row[2], row[2]])
                    output_data.append(new_row)

# 将合并后的数据写入新文件
with open(output_file, "w") as output:
    for row in output_data:
        output.write(row + "\n")

print("合并完成!")

以下脚本可以根据某一阈值筛选文件

import csv
import argparse

def process_csv(input_file, output_file):
    with open(input_file, 'r') as input_csv, open(output_file, 'w', newline='') as output_csv:
        reader = csv.reader(input_csv)
        writer = csv.writer(output_csv)
        
        for row in reader:
            if len(row) >= 6:
                try:
                    value = float(row[5])
                    if value < 1e-4:
                        writer.writerow(row)
                except ValueError:
                    continue

# 解析命令行参数
parser = argparse.ArgumentParser(description='Process CSV file')
parser.add_argument('-i', '--input', type=str, help='input CSV file')
parser.add_argument('-o', '--output', type=str, help='output CSV file')
args = parser.parse_args()

# 检查输入和输出参数是否提供
if not args.input or not args.output:
    print('请输入输入和输出参数。使用 -h 或 --help 查看帮助。')
else:
    process_csv(args.input, args.output)
    print('已完成CSV文件处理。')
以下代码可以根据LD添加加阈值
import sys

# 获取命令行参数
input_file = sys.argv[1]
output_file = sys.argv[2]

# 读取输入文件、处理数据并写入输出文件
with open(input_file, 'r') as input_f, open(output_file, 'w') as output_f:
    for line in input_f:
        # 分割每行数据
        columns = line.strip().split('\t')
        
        # 对第二列和第三列进行操作
        new_columns = [str(int(column) - 213000) if index == 1 else str(int(column) + 213000) if index == 2 else column for index, column in enumerate(columns)]
        
        # 构建新的行数据
        new_line = '\t'.join(new_columns) + '\n'
        
        # 将新行数据写入输出文件
        output_f.write(new_line)
###RMVP标记显著性位点
args<-commandArgs(TRUE)
library(rMVP)
library(dplyr)
df1<- read.csv(args[1],header = TRUE)
df1<- select(df1,-4,-5)
df1<- na.omit(df1)
colnames(df1)[1]<-"id"
colnames(df1)<-c("SNP","CHR","BP","P")
head(df1)
hig<-read.table(args[2],header = FALSE)
MVP.Report(df1,   
                  col = c("#4197d8", "#f8c120", "#d581b7", "#83d3ad","#d60b6f", "#413496", "#495226","#e66519", "#7c162c", "#26755d"),
           threshold = 1e-5, threshold.lwd = 3, amplify = FALSE,  highlight = hig, highlight.cex = 1.5, highlight.pch = 19, highlight.col = "black", 
           file.output = TRUE,file.type = "jpg", dpi = 300, height = NULL, width = NULL)
上一篇下一篇

猜你喜欢

热点阅读