根据VCF文件探测差异SNP并设计引物序列

根据VCF设计Marker序列

问题描述:如果有两个样品的测序数据,并通过GATK等上游分析得到了变异位点信息,现在我想要找任意两个样品的差异SNP,并提取该位置上下游50bp序列,用于设计引物,应该怎么做?

本文将分享一种基于R语言从VCF文件快速获得引物设计序列的方法,用于从变异位点的vcf文件中寻找两样品的差异位点,并寻找参考基因组指定位置上下游区间,设计Marker引物序列。


1. 加载软件包

library(vcfR)
library(tidyverse)

首先加载vcfR和tidyverse包,分别用于vcf文件的读取和数据操作。

2. 设置参数

file_name <- "xxx.vcf" #输入文件名
out_name <- str_replace(file_name,".vcf","_marker.csv"#设置输出文件名
ref <- "xxx_assembly.fa" # 参考基因组序列位置
dir_samtools <- "~/miniconda3/envs/work/bin/samtools" # samtools安装位置

以上代码定义了输入和输出文件,以及samtools的位置,用于后续与参考基因组的交互检索。其中xxx.vcf文件是至少包含两个样品的变异信息数据,默认比较前两个样品。

3. 读取并合并数据

vcf <- read.vcfR(file_name)
df <- cbind(as.data.frame(vcf@fix),as.data.frame(vcf@gt))

读取VCF文件并合并固定的信息和基因型信息,生成一个数据框,用于后续数据清洗。

4. 判断变异位点类型

df$type <- NA
for (i in 1:nrow(df)){
      if (df[i,10] == df[i,11]){
            df$type[i] <- "same"
      }else{df$type[i] <- "diff"}
}

遍历每行SNP数据,通过比较特定列来判断两样品的变异位点是相同还是不同。

5. 提取不同位点和单点突变

filter <- df[which(df$type=="diff"),]
filter_snp <- filter[grep("^s",filter$ID,value = F),]

然后筛选出不同的位点,并进一步提取单点突变(SNP),通过筛选算法只提取SNP,过滤插入缺失突变。

6. 生成中间变异位点信息


filter_snp$info <- str_c("[",filter_snp$REF,
                     "/",filter_snp$ALT,"]")

这句代码生成了变异位点的信息,格式为“[参考基因型/替代基因型]”。

7. 获取参考序列函数

get_seq <- function(Chr,pos_a,pos_b){
      cmd <- str_c(dir_samtools," faidx ",ref," ",Chr,":",pos_a,"-",pos_b)
      tem <- system(cmd,intern = T)
      return(paste(tem[2:length(tem)],collapse = ""))
}

该函数使用samtools来获取参考基因组的序列信息,只需要输入染色体名称,起始位置和终止位置,就可以自动返回这段区域的序列信息。

8. 迭代获取参考序列信息

for (i in 1:nrow(filter_snp)){
      seq_head <- get_seq(filter_snp$CHROM[i],
                          as.numeric(filter_snp$POS[i]) - 100,
                          as.numeric(filter_snp$POS[i]) - 1)
      seq_tail <- get_seq(filter_snp$CHROM[i],
                          as.numeric(filter_snp$POS[i]) + 1,
                          as.numeric(filter_snp$POS[i]) + 100)
      filter_snp$out[i] <- str_c(seq_head,filter_snp$info[i],seq_tail)
}

这部分代码迭代遍历差异SNP,并使用get_seq函数获取每个SNP附近的序列,以便于设计引物。

9. 输出结果

write.csv(filter_snp,file = out_name,quote = F)

最后,差异SNP及其周围序列的信息被保存为CSV文件,下载后就可以用于直接设计引物了。

总结

上述R脚本提供了一种方法来识别两个材料序列之间的差异位点,并设计marker引物序列,可用于生物学研究,有助于解放双手,早点下班哈哈哈哈。


完整代码如下:

library(vcfR)
library(tidyverse)

# 设置运行参数
file_name <- "xxx.vcf" #输入文件名,重测序提取的数据文件
out_name <- str_replace(file_name,".vcf","_marker.csv"#设置输出文件名,csv文件
ref <- "xx_assembly.fa" # 参考基因组序列位置
dir_samtools <- "~/miniconda3/envs/work/bin/samtools" # samtools安装位置

# 读取并合并数据
vcf <- read.vcfR(file_name)
df <- cbind(as.data.frame(vcf@fix),as.data.frame(vcf@gt))

# 判断变异位点类型
df$type <- NA
for (i in 1:nrow(df)){
      if (df[i,10] == df[i,11]){
            df$type[i] <- "same"
      }else{df$type[i] <- "diff"}
}

# 提取两份材料中不同的位点
filter <- df[which(df$type=="diff"),]
# 提取单点突变
filter_snp <- filter[grep("^s",filter$ID,value = F),]

print(str_c("结果:共找到变异位点 ",nrow(df),
            "个!其中包括差异SNP ",nrow(filter_snp),"个!"))
# 生成中间变异位点信息
filter_snp$info <- str_c("[",filter_snp$REF,"/",filter_snp$ALT,"]")

# 定义一个函数,获取参考基因组序列信息
get_seq <- function(Chr,pos_a,pos_b){
      cmd <- str_c(dir_samtools," faidx ",ref," ",Chr,":",pos_a,"-",pos_b)
      tem <- system(cmd,intern = T)
      return(paste(tem[2:length(tem)],collapse = ""))
}

# 迭代获取参考序列信息
filter_snp$out <- NA
for (i in 1:nrow(filter_snp)){
      seq_head <- get_seq(filter_snp$CHROM[i],
                          as.numeric(as.numeric(filter_snp$POS[i]) - 100),
                          as.numeric(as.numeric(filter_snp$POS[i]) - 1))
      seq_tail <- get_seq(filter_snp$CHROM[i],
                          as.numeric(filter_snp$POS[i]) + 1,
                          as.numeric(filter_snp$POS[i]) + 100)
      filter_snp$out[i] <- str_c(seq_head,filter_snp$info[i],seq_tail)
}

write.csv(filter_snp,file = out_name,quote = F)

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/23243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++和Lua交互总结

C和Lua交互总结 Chapter1. C和Lua交互总结一、Lua与C的交互机制——Lua堆栈二、堆栈的操作三、C 调用 Lua1&#xff09;C获取Lua值2&#xff09;C调用Lua函数示例&#xff1a; 四、Lua 调用 C包装C函数 最后总结一下 Chapter1. C和Lua交互总结 原文链接&#xff1a;https://bl…

c++实现Qt对象树机制

文章目录 对象树是什么使用对象树的好处使用c实现对象树 对象树是什么 我们常常听到 QObject 会用对象树来组织管理自己&#xff0c;那什么是对象树&#xff1f;  这个概念非常好理解。因为 QObject 类就有一个私有变量 QList<QObject *>&#xff0c;专门存储这个类的子…

基于vue-cli3的vue项目 通过postcss-pxtorem 实现px自动转换成rem并解决版本问题

1、npm安装依赖 npm install lib-flexible --save npm install postcss-pxtorem --save-dev 2、引入lib-flexible 在项目入口文件main.js 中引入lib-flexible import "lib-flexible/flexible.js"; 3、 配置postcss-pxtorem vue-cli3 项目postcss-pxtorem的…

【Vue】在执行事件中含有axios的值实现同步说明(自己用)

两个 async和await 一、父事件代码 async function WxEdit(wxValue,wxShcompany) {let ifDate await SelectWx(wxShcompany);console.log("#############");console.log(ifDate);alert(ifDate); } 二、子事件代码 async function SelectWx(wxShcompany) {let me…

上海亚商投顾:沪指震荡微涨 金融、地产午后大幅走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数早盘震荡&#xff0c;午后集体拉升反弹&#xff0c;创业板指涨超1%。券商等大金融板块午后再度走强&#…

问题解决方案

前端开发 1、npm安装的时候老是卡住 reify:rxjs: timing reifyNode:node_modules/vue/cli/node_modules 查看当前使用的那个镜像 nrm lsnpm ---------- https://registry.npmjs.org/yarn --------- https://registry.yarnpkg.com/cnpm --------- https://r.cnpmjs.org/taobao …

用docker 部署springboot项目

# 加入java FROM bitnami/java # WORKDIR /usr/local/test/boot-work#镜像内的工作目录 WORKDIR /usr/local/test# ENV workPath /usr/local/test/boot-work# 宿主的当前目录 boot-v1.jarjar 拷贝到 WORKDIR下boot.jar ADD boot-v1.jar boot.jar # 暴露80端口 EXPOSE 80 # 启动…

力扣 343. 整数拆分

题目来源&#xff1a;https://leetcode.cn/problems/integer-break/description/ C题解1&#xff1a;动态规划。dp[i] 代表数字i拆分后得到的最大乘积。递归公式为拆分后两个数的最大乘积相乘&#xff0c;即 dp[i] max(dp[i], dp[j] * dp[i-j])。对于n2或3需要另外讨论。 cla…

Review 2016/3-2023/7

Review 2016/3-2023/7 将对2016年3月至2023年7月的工作和学习内容进行整理&#xff0c;暂定以下模块 一、数据结构与算法 1.阅读《算法导论》未阅读章节&#xff0c;并实现相应数据结构与算法 2.阅读《数据结构基础》&#xff0c;并实现相应数据结构与算法 3.阅读《计算几何…

Scratch 教程:如何实现文本分割

在平时&#xff0c;我们通常会有分割文本的要求&#xff0c;但扩展却又无法使用scratch离线版打开&#xff0c;咋办呢&#xff1f;我们可以用原版做出来&#xff01; 没关系&#xff0c;我来教你&#xff01; 我们自定义一个函数&#xff0c;之后要分割调用就行了 创建三个变量…

【bug】记录一次使用Swiper插件时loop属性和slidersPerView属性冲突问题

简言 最近在vue3使用swiper时&#xff0c;突然发现loop属性和slides-per-view属性同时存在启用时&#xff0c;loop生效&#xff0c;下一步只能生效一次的bug&#xff0c;上一步却是好的。非常滴奇怪。 解决过程 分析属性是否使用错误。 loop是循环模式&#xff0c;布尔型。 …

Oracle:merge into用法

文章目录 merge into使用场景merge into语法测试表普通模式 merge使用注意点 merge into MERGE 是 Oracle9i 新增的语法&#xff0c;根据源表对目标表进行匹配查询&#xff0c;匹配成功时更新&#xff0c;不成功时插入 比单独的 update insert 的方式效率要更高&#xff0c;尤…

iptables防火墙

一、防火墙概述 防火墙分两种&#xff1a; 硬件防⽕墙&#xff1a;通过硬件和软件的组合&#xff0c;基于硬件的防⽕墙保护整个内部网络安全。&#xff08;例如 华为E9000&#xff09; 软件防⽕墙&#xff1a;通过纯软件&#xff0c;单独使⽤软件系统来完成防⽕墙功能&#x…

我的创作纪念日2023.8.5

机缘 在CSDN的创作开始于去年&#xff0c;创作的初衷是希望对自己的学习经历进行记录&#xff0c;同时也把自己的经验和收获传递给更多需要的小伙伴。创作博客的过程是一个将输入的知识进行再生产的过程&#xff0c;在此期间&#xff0c;知识获得了沉淀和提纯&#xff0c;思路…

8.1 配置环境/Linux进程管理总结/Argument/saveload Module/切片

文章目录 一、配置环境二、Linux 进程管理总结三、ArgumentParser四、Saving and Loading Models nn.ModulesWarmstarting Model Using Parameters from a Different Model五、切片&#xff01;拓展&#xff1a; 一、配置环境 github配置环境可以直接赋值到txt中&#xff0c;然…

修复 Adob​​e After Effects 预览无法工作/播放的方法技巧

Adobe After Effects 允许您预览视频和音频&#xff0c;而无需将其渲染为最终输出。当您无法在此应用程序中预览视频和音频时&#xff0c;一定会感到沮丧。不过不用担心&#xff0c;您可以尝试以下方法来修复 After Effects 预览不起作用的问题。 技巧1&#xff1a;重启After …

2023年 Java 面试八股文(20w字)

目录 第一章-Java基础篇 1、你是怎样理解OOP面向对象 难度系数&#xff1a;⭐ 2、重载与重写区别 难度系数&#xff1a;⭐ 3、接口与抽象类的区别 难度系数&#xff1a;⭐ 4、深拷贝与浅拷贝的理解 难度系数&#xff1a;⭐ 5、sleep和wait区别 难度系数&a…

各种大数据概念笔记

各种大数据概念 1 数据仓库数据分层定义 1.1 方式1 宽表-topic 事实层-fact 基础整合层 1.2 方式二 ADS:Application Data Service,应用数据层 也可以称为或者发展为DM data marketing,供线上系统使用 CDM:Common Data Model DWD:Data Warehouse Detail,明细数据层。 也…

Mac电脑怎么使用“磁盘工具”修复磁盘

我们可以使用“磁盘工具”的“急救”功能来查找和修复磁盘错误。 “磁盘工具”可以查找和修复与 Mac 磁盘的格式及目录结构有关的错误。使用 Mac 时&#xff0c;错误可能会导致意外行为&#xff0c;而重大错误甚至可能会导致 Mac 彻底无法启动。 继续之前&#xff0c;请确保您…

DP-GAN-判别器代码

将输出的rgb作为输入&#xff0c;输入到判别器中。接着执行一个for循环&#xff0c;看一下body_down列表的组成和x经过body_down之后的值。 body_down是由残差块D组成的列表&#xff1a; 残差块的参数为&#xff1a;(3,128),(128,128),(128,256),(256,256),(256,512),(512,5…