利用R語言實(shí)現(xiàn)vcf轉(zhuǎn)txt算法,基于vcfR和tidyverse

算法:vcf轉(zhuǎn)txt并自動(dòng)規(guī)范化

引言

vcf文件是存放基因變異信息的一種方式,本文提供一種算法,用于讀取vcf文件并轉(zhuǎn)換等位基因展示方法、替換染色體展示格式、以及自動(dòng)識(shí)別非唯一變異并進(jìn)行修改,用于對(duì)變異信息進(jìn)行整理。


主要步驟與設(shè)計(jì)思路

  • 讀取VCF文件并分為三部分儲(chǔ)存
  • 提取變異信息并批量替換
  • 修改染色體格式
  • SNP位點(diǎn)的判斷與校正
  • 單點(diǎn)堿基差異唯一化

項(xiàng)目運(yùn)行環(huán)境

  • centos7 linux
  • R4.2.3

具體操作步驟

加載R包與數(shù)據(jù)

library(tidyverse)
library(vcfR)
library(do)
library(R.utils)
df <- read.table(paste0("02_ordata/",job,".filter.vcf"),header = F)
vcf <- read.vcfR(paste0("02_ordata/",job,".filter.vcf.gz"))
chr_ref <- read.table("01_scripts/chr_num2str.txt",header = T)

讀取VCF文件信息

fix <- vcf@fix
gt <- vcf@gt
meta <- vcf@meta

利用vcfR包讀取入VCF文件后,分別提取出不同部分存放于臨時(shí)變量中,以供后續(xù)使用。

批量替換變異信息

### 批量替換“|”為“/” ==================================================================
df[df == "0|0"] = "0/0"
df[df == "1|0"] = "1/0"
df[df == "0|1"] = "0/1"
df[df == "1|1"] = "1/1"
colnames(df) <- c(colnames(fix),colnames(gt))

該步驟的目的是為了將|修改為/,這是后面轉(zhuǎn)hmp格式所需的條件。

替換染色體編號(hào)

###  替換染色體 =====================================================================
for (i in 1:nrow(df)){
  old_chr <- df$CHROM[i]
  for (k in 1:nrow(chr_ref)){
    if (chr_ref$chr_str[k] == old_chr){
      new_chr <- chr_ref$chr_num[k]
      df$CHROM[i] <- new_chr
    }
  }
}

利用for循環(huán)查找逐一取出染色體元素值,然后從參考信息中查找對(duì)應(yīng)的正確格式,然后賦值給染色體信息,這一步中使用的chr_ref是染色體不同格式的對(duì)應(yīng)信息。

參數(shù)識(shí)別與矯正

因?yàn)橛胁迦肴笔У拇嬖冢詤⒖嘉恢煤蛯?shí)際位置的堿基并非完全唯一且差異,這將導(dǎo)致后面運(yùn)行出錯(cuò)。這里提供一個(gè)算法,批量實(shí)現(xiàn)對(duì)SNP位點(diǎn)的檢測(cè)與矯正。

  • snp_reverse函數(shù)
snp_reverse <- function(one,more){
  # 輸入倆參,一為單二為多,返回存在于多但不與單同之值
  list_snp <- str_split(more,"")
  for (i in 1:str_length(more)){
    snp_now <- list_snp[[1]][i]
    ifelse(one==snp_now,next,return(snp_now))
  }
}

該函數(shù)輸入兩個(gè)參數(shù),如“A,CATG”,首先將第二個(gè)參數(shù)分割成單個(gè)字母,然后迭代判斷第一個(gè)字母是否與第二個(gè)一致,一旦出現(xiàn)與第一個(gè)參數(shù)不相同的值則返回該值。目的是為了讓兩個(gè)值長(zhǎng)度為1且不相同。

批量處理ALT和REF位點(diǎn)

# 對(duì)每行的REF和ALT進(jìn)行處理,將其變成不同值
for (i in 1:nrow(df)){
  ref <- df$REF[i]
  alt <- df$ALT[i]
  # 情況有三,均為單或其一為多
  if (str_length(ref) == 1){
    if (str_length(alt) == 1){
    }else{
      df$ALT[i] <- snp_reverse(ref,alt)
    }
  }else{
    if (str_length(alt) == 1){
      df$REF[i] <- snp_reverse(alt,ref)
    }else{
      print(paste0("ERROR:",df$ID[i]," this snp has more REF、ALT !"))
    }
  }
}

結(jié)果保存與輸出

colnames(df)[1] <- "#CHROM"
write.table(df,paste0("03_vcf2txt/","gene_",job,".txt"),
            sep = "\t",row.names = F,col.names = T,quote = F)
print(paste0(job," Step ordata gene vcf to txt finished!"))

通過該算法能夠?qū)cf文件進(jìn)行轉(zhuǎn)換,并得到規(guī)范化的txt文件,用于后續(xù)的分析。

本文由mdnice多平臺(tái)發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容