R语言丨根据VCF文件自动填充对其变异位点并生成序列fa文件

这篇具有很好参考价值的文章主要介绍了R语言丨根据VCF文件自动填充对其变异位点并生成序列fa文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

根据VCF文件自动填充对其变异位点并生成序列fa文件

首先提出一个问题
假如有一个重测序结果VCF文件,里面包含了很多个样本在几百个突变位点(snp和iad)的基因型数据,现在想根据这份原始数据,得到一个fasta序列文件,包含每个样品在这些位点的各自序列信息,应该怎么做?

解决思路与方法简介

方法一:Excel手工处理

  1. 将vcf文件转成Excel表格
  2. 判断每个变异位点的类型是snp或者iad
  3. 如果是iad,将REF和ALT补全,保证长度一致
  4. 根据基因型判断填充内容
  5. 按顺序合并每个样品对应的位点信息
  6. 生成fa序列文件

方法二:R语言算法处理

  1. 读入vcf文件并切分成基因信息、样品列表、位点信息三部分
  2. 对位点信息进行处理,枚举每个碱基,判断长度之和
  3. 若总长度为2,则说明为单点突变SNP
  4. 若总长度大于2,则为插入缺失突变,进一步锁定单碱基
  5. 填充占位符,保证插入缺失的两端对齐
  6. 根据位点类型循环填充基因型信息
  7. 根据样品列表迭代生成所有样品的fa序列

主要算法和步骤

加载数据

rm(list=ls())
library(tidyverse)
library(xlsx)
df <- read.xlsx("./genevcf.xlsx",sheetIndex = 1)
num_snp <- ncol(df)-12 #这里修改表头列数
num_sam <- nrow(df)-7  #这里修改表头行数
print(str_c("SNP number:",num_snp,"    Sample number:",num_sam))

这段代码的主要功能是读取一个名为“genevcf.xlsx”的Excel文件的第一个工作表,并根据读取到的数据计算SNP位点的数量和样本的数量。

其中,通过使用library(tidyverse)library(xlsx)导入了两个R语言包以进行数据处理和读写Excel文件。

首先,read.xlsx()函数被用来读取Excel文件,其中sheetIndex = 1表示选取第一个工作表作为读取的对象。

之后,代码从数据中获取SNP位点的数量,这里假设该Excel文件的表头有12列,将除去这12列的剩余列数赋值给变量num_snp

同理,假设该Excel文件的表头有7行,则将除去这7行的剩余行数赋值给变量num_sam。最后,通过print()函数和str_c()函数将计算得到的SNP位点数和样本数打印出来。

拆分与整理数据

df_snp <- cbind(df[1:7,1],df[1:7,13:ncol(df)]) #snp信息
df_snp <- t(df_snp)
colnames(df_snp) <- df_snp[1,]
df_snp <- df_snp[-1,-7] 
df_snp <- as.data.frame(df_snp)
df_snp$len <- nchar(str_c(df_snp$REF,df_snp$ALT))
rownames(df_snp) <- 1:nrow(df_snp)
df_snp$type_0 <- NA # 纯合0/0
df_snp$type_1 <- NA # 纯合1/1
df_snp$type_x <- NA # 杂合1/0和0/1
  1. 将df_snp矩阵进行转置,即将行列互换。
  2. 将矩阵的第一行的值作为列名。
  3. 删除第一行第七列的值。
  4. 将矩阵转化为数据框。
  5. 将REF和ALT两列的字符串拼接在一起,计算字符串长度,将得到的新列命名为len。
  6. 将数据框的行名重置为1到行数。

计算基因型组合方式

for (i in 1:nrow(df_snp)){
      if (df_snp$len[i]==2){ #单个snp
            df_snp$type_0[i] <- str_c(df_snp$REF[i],df_snp$REF[i])
            df_snp$type_1[i] <- str_c(df_snp$ALT[i],df_snp$ALT[i])
            df_snp$type_x[i] <- str_c(df_snp$REF[i],df_snp$ALT[i])
      }else{
            n_REF <- nchar(df_snp$REF[i])
            n_ALT <- nchar(df_snp$ALT[i])
            if (n_REF == 1){ # REF为单个碱基,ALT为多碱基
                  df_snp$type_0[i] <- str_c(df_snp$REF[i],paste(rep("-",n_ALT),collapse = ""))
                  df_snp$type_1[i] <- str_c("-",df_snp$ALT[i])
                  df_snp$type_x[i] <- str_c(df_snp$REF[i],df_snp$ALT[i])
            }else{ # ALT为单碱基
                  df_snp$type_1[i] <- str_c(df_snp$ALT[i],paste(rep("-",n_REF),collapse = ""))
                  df_snp$type_0[i] <- str_c("-",df_snp$REF[i])
                  df_snp$type_x[i] <- str_c(df_snp$REF[i],df_snp$ALT[i])
            }
      }
}
  1. 对于数据框df_snp中每一行:
  2. 如果该行的len等于2,说明该行代表单个SNP,则将该行的REF和ALT两列的值拼接得到三个新的列:type_0,type_1和type_x。其中type_0和type_1分别代表两个等位基因,type_x代表两个等位基因的组合。
  3. 如果该行的REF为单个碱基,ALT为多碱基,则将该行的REF和ALT两列的值拼接得到三个新的列:type_0,type_1和type_x。其中type_0代表REF基因型,type_1代表ALT基因型,type_x代表两个等位基因的组合。在得到type_0时,会在REF基因前面加上与ALT基因数量相等的“-”符号。
  4. 如果该行的ALT为单个碱基,则将该行的REF和ALT两列的值拼接得到三个新的列:type_0,type_1和type_x。其中type_1代表ALT基因型,type_0代表REF基因型,type_x代表两个等位基因的组合。在得到type_1时,会在ALT基因前面加上与REF基因数量相等的“-”符号。

变异类型转换函数

df_gene <- df[8:nrow(df),13:ncol(df)] 
rownames(df_gene) <- 1:nrow(df_gene)
colnames(df_gene) <- str_c("snp",1:ncol(df_gene))
function_snp_convert <- function(n,r0,r1,rx){
      if (n == "0|0"){
            return(r0)
      }else{
            if (n == "1|1"){
                  return(r1)
            }else{
                  return(rx)
            }
      }
}

首先,代码从数据框df中提取出基因型信息存储到df_gene中,同时对行列名进行了重新命名,行名从1开始递增,列名以snp 加上相应的列数编号。接下来定义function_snp_convert函数,这个函数被设计成可以计算不同基因型的组合方式,并分别返回对应的结果值。其中,参数n表示某一基因型,参数r0r1rx分别表示三种不同的结果。具体的实现逻辑是,若基因型为“0|0”,则返回r0;若基因型为“1|1”,则返回r1;否则如果不是以上两种情况,则返回rx

遍历替换基因数据

for (x in 1:nrow(df_gene)){
      for (y in 1:ncol(df_gene)){
           df_gene[x,y] <- function_snp_convert(df_gene[x,y],
                                 df_snp$type_0[y],
                                 df_snp$type_1[y],
                                 df_snp$type_x[y])
      }
}

使用了两个循环,逐行逐列地读取df_gene数据框中的元素,并调用function_snp_convert函数将读取的元素代入函数相应的参数中进行计算,将计算结果存储回df_gene数据框中对应的位置,以此实现了对df_gene数据框中所有元素根据不同基因型进行计算的功能。

for循环的x和y分别表示df_gene数据框中的行下标和列下标,每次循环时调用function_snp_convert函数,并传入相应的参数,将计算结果存储回df_gene数据框的对应元素中。其中,df_gene[x, y]实际上就是df_gene数据框中第x行第y列位置的元素,而df_snptype_0[y]df_snptype0[y]dfsptype_1[y]df_snp$type_x[y]分别表示df_snp数据框中第y列三个不同的基因型组合方式。

生成fasta序列文件

df_name <- df[8:nrow(df),1] 
fasta <- c()
for (index in 1:length(df_name)){
      print(df_name[index])
      fasta <- c(fasta,str_c(">",df_name[index]))
      fasta <- c(fasta,str_c(df_gene[index,],collapse = ""))
      print(str_c(df_gene[index,],collapse = ""))
}
rownames(df_gene) <- df_name
colnames(df_gene) <- df_snp$ID
write.csv(df_gene,"ID_SNP_ATCG.csv",quote = F)
write.table(fasta,"all.fa",quote = F,row.names = F,col.names = F)

在这段代码中,首先提取了数据框 df 第8到最后一行的第1列数据,作为样品名称列表 df_name。

然后初始化了一个空向量 fasta。接下来的 for 循环会迭代样品名称列表 df_name 的所有元素。每次循环,会打印该元素名称,并将 “>” 和该元素名称拼接成的字符串添加至 fasta 中。

然后将 df_gene 的第 index 行拼接为字符串后加入 fasta 中。最后,将 df_name 赋值为 df_gene 数据框的行名,df_snp 的 ID 列作为 df_gene 的列名,该代码的作用是生成一个 fasta 格式的序列文件。

本文由mdnice多平台发布文章来源地址https://www.toymoban.com/news/detail-435900.html

到了这里,关于R语言丨根据VCF文件自动填充对其变异位点并生成序列fa文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 压缩算法的原理丨基因型vcf文件为什么压缩后发生了什么?

    最近碰到一个神奇的现象,一份大小为 16GB 的 xx.vcf.gz 文件,解压之后体积变为 600GB 的 vcf 文件,为什么一份文件经过压缩后体积缩小了这么多? 压缩 这个词联想到压缩机,就是把空气进行物理加压,减小占用的体积,这种方法利用的是单个分子之间的可变间隙,像挤海绵一

    2024年02月15日
    浏览(43)
  • 基于 OpenCV 开发实现自动读取气泡测试表并对其进行评分

    文末提供免费的源代码下载链接 为了构建项目,我们需要遵循的步骤是: 找出图像中的轮廓。 使用文档的轮廓获取文档的自上而下视图。 找到文档上两个最大的轮廓。 遮盖文档中除最大轮廓区域之外的所有内容。 分割最大轮廓的区域以获得框中的每个 答案 。 仔细检查每

    2024年02月12日
    浏览(44)
  • 实现一个vscode插件:打开多个vscode项目时根据.nvmrc文件自动切换nvm

    开发背景与最终功能 需要维护一些老项目,同时开发新项目时,切换nvm很烦人 最终实现vscode插件:每个vscode实例打开一个项目,切换vscode实例时能自动切换版本(需要项目根目录有一个.nvmrc文件) 插件下载 vscode插件市场搜索 vscode-nvmrc 设计思路 项目根目录新建 .nvmrc 文件,

    2024年02月15日
    浏览(41)
  • c# 通过现在文件夹,获取下面所有的照片,并对其进行统一尺寸裁剪

    c# 通过现在文件夹,获取下面所有的照片,并对其进行统一尺寸裁剪 using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Syst

    2023年04月26日
    浏览(52)
  • 禁止浏览器自动填充密码功能,设置自动填充背景色。

    text设置autocomplete=“off” password设置 autocomplete=“new-password” 两个一起设置,就不会自动填充了。 自动填充后,阴影颜色变为黑色。 需要设置为0,不显示阴影。 设置完后,自动填充没有阴影了。

    2024年02月16日
    浏览(39)
  • DolphinDb时序自动填充

    语法 asFreq(X, rule, [closed], [label], [origin=’start_day’]) 参数 X 是有时间类型索引的矩阵(由 setIndexedMatrix! 创建)或序列(由 setIndexedSeries! 创建)。 rule 可以是一个字符串,可取以下值,亦可为一个时间类型的向量。 Y参数取值 对应DolphinDB函数 “B” businessDay “W” weekEnd “

    2024年02月08日
    浏览(43)
  • 公共字段自动填充工具

    1、问题描述 在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工时需要设置修改时间和修改人等字段。这些字段属于公共字段,也就是很多表中都有这些字段,如下(示例): 字段 类型 create_time datetime update_time datetime create_user bigint update_user bi

    2024年02月16日
    浏览(48)
  • MybatisPlus自动填充-MetaObjectHandler接口

    MetaObjectHandler是MybatisPlus提供的一个扩展接口,使用这个接口可以在插入和更新时为一些自段设置默认值(类似自动填充策略)。

    2024年02月09日
    浏览(91)
  • MybatisPlus自动填充创建(更新)时间

    目录 一、实现MetaObjectHandler 二、使用注解 在大多数情况下,我们在创建数据库时都会加上创建、更新时间这些字段,为了保证数据的可追溯性,当然肯定还是有操作日志记录表用来做追溯记录。开发中每一次的创建更新都需要手动去设置这一次操作的时间,会有很多的代码

    2024年02月12日
    浏览(38)
  • Mybtisplus对时间字段进行自动填充

            这里我主要对字段createTime和updateTime进行自动填充,你们可以修改为自己对应的字段即可。         在需要填充的字段上加入 @TableField(fill = FieldFill.INSERT)或者 @TableField(fill = FieldFill.UPDATE),当执行SQL语句时就会拦截语句随后对SQL语句添加了@TableField的时间字段进行时

    2024年01月25日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包