算法丨根据基因型VCF文件自动识别变异位点并生成序列fasta文件,基于R语言tidyverse

简介: 算法丨根据基因型VCF文件自动识别变异位点并生成序列fasta文件,基于R语言tidyverse

根据VCF文件生成序列fasta文件

首先提出一个问题:假如有一个基因型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 格式的序列文件。

END

© 素材来源于网络,侵权请联系后台删除

笔记合集,点击直达

相关文章
|
2月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
106 2
|
3月前
|
机器学习/深度学习 并行计算 算法
【超级棒的算法改进】融合鱼鹰和柯西变异的麻雀优化算法研究(Matlab代码实现)
【超级棒的算法改进】融合鱼鹰和柯西变异的麻雀优化算法研究(Matlab代码实现)
157 1
|
6月前
|
机器学习/深度学习 算法 数据挖掘
基于WOA鲸鱼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB 2022a/2024b实现,采用WOA优化的BiLSTM算法进行序列预测。核心代码包含完整中文注释与操作视频,展示从参数优化到模型训练、预测的全流程。BiLSTM通过前向与后向LSTM结合,有效捕捉序列前后文信息,解决传统RNN梯度消失问题。WOA优化超参数(如学习率、隐藏层神经元数),提升模型性能,避免局部最优解。附有运行效果图预览,最终输出预测值与实际值对比,RMSE评估精度。适合研究时序数据分析与深度学习优化的开发者参考。
|
6月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本内容包含基于BiLSTM与遗传算法(GA)的算法介绍及实现。算法通过MATLAB2022a/2024b运行,核心为优化BiLSTM超参数(如学习率、神经元数量),提升预测性能。LSTM解决传统RNN梯度问题,捕捉长期依赖;BiLSTM双向处理序列,融合前文后文信息,适合全局信息任务。附完整代码(含注释)、操作视频及无水印运行效果预览,适用于股票预测等场景,精度优于单向LSTM。
|
3月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于WOA鲸鱼优化的XGBoost序列预测算法matlab仿真
基于WOA优化XGBoost的序列预测算法,利用鲸鱼优化算法自动寻优超参数,提升预测精度。结合MATLAB实现,适用于金融、气象等领域,具有较强非线性拟合能力,实验结果表明该方法显著优于传统模型。(238字)
|
10月前
|
机器学习/深度学习 存储 算法
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
6月前
|
算法 数据安全/隐私保护
基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密
本项目实现了一种基于Logistic Map混沌序列的数字信息加解密算法,使用MATLAB2022A开发并包含GUI操作界面。支持对文字、灰度图像、彩色图像和语音信号进行加密与解密处理。核心程序通过调整Logistic Map的参数生成伪随机密钥序列,确保加密的安全性。混沌系统的不可预测性和对初值的敏感依赖性是该算法的核心优势。示例展示了彩色图像、灰度图像、语音信号及文字信息的加解密效果,运行结果清晰准确,且完整程序输出无水印。
基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密
|
6月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB2022a/2024b开发,结合粒子群优化(PSO)算法与双向长短期记忆网络(BiLSTM),用于优化序列预测任务中的模型参数。核心代码包含详细中文注释及操作视频,涵盖遗传算法优化过程、BiLSTM网络构建、训练及预测分析。通过PSO优化BiLSTM的超参数(如学习率、隐藏层神经元数等),显著提升模型捕捉长期依赖关系和上下文信息的能力,适用于气象、交通流量等场景。附有运行效果图预览,展示适应度值、RMSE变化及预测结果对比,验证方法有效性。
|
6月前
|
算法 数据安全/隐私保护
基于混沌序列和小波变换层次化编码的遥感图像加密算法matlab仿真
本项目实现了一种基于小波变换层次化编码的遥感图像加密算法,并通过MATLAB2022A进行仿真测试。算法对遥感图像进行小波变换后,利用Logistic混沌映射分别对LL、LH、HL和HH子带加密,完成图像的置乱与扩散处理。核心程序展示了图像灰度化、加密及直方图分析过程,最终验证加密图像的相关性、熵和解密后图像质量等性能指标。通过实验结果(附图展示),证明了该算法在图像安全性与可恢复性方面的有效性。
|
7月前
|
存储 监控 算法
基于 C# 的局域网计算机监控系统文件变更实时监测算法设计与实现研究
本文介绍了一种基于C#语言的局域网文件变更监控算法,通过事件驱动与批处理机制结合,实现高效、低负载的文件系统实时监控。核心内容涵盖监控机制选择(如事件触发机制)、数据结构设计(如监控文件列表、事件队列)及批处理优化策略。文章详细解析了C#实现的核心代码,并提出性能优化与可靠性保障措施,包括批量处理、事件过滤和异步处理等技术。最后,探讨了该算法在企业数据安全监控、文件同步备份等场景的应用潜力,以及未来向智能化扩展的方向,如文件内容分析、智能告警机制和分布式监控架构。
207 3

热门文章

最新文章