簡體   English   中英

R:如何根據第一個字符 0|0 vs 1|0 vs 0|1 vs 1|1 重新編碼值

[英]R: How to recode values based on first characters 0|0 vs 1|0 vs 0|1 vs 1|1

預先感謝您的幫助。

我正在嘗試重新編碼一個包含以 VCF 格式編碼的基因型的基因數據庫。 對於上下文,VCF 格式以這種格式編碼:'0|0:0,0:0:1,0,0'。 我最感興趣的是前兩個(/三個如果包括|)字符: 0|0 :0,0:0:1,0,0。 如果這些為 0|0,則意味着該人具有兩個顯性等位基因。 如果這些是 1|1,則兩個隱性等位基因。 1|0 和 0|1 是兩者的混合。

我正在研究一個名為“gg”的數據框,它包含大約 120 列(每個 SNP 一個)和 1500 行(研究中的每個主題一個)。

我正在嘗試將 SNP 從其當前格式重新編碼為更易於分析的格式:

  • 0|0 = 兩個顯性等位基因 - 重新編碼為 0
  • 0|1 或 1|0 = 一個顯性和一個隱性的混合 - 重新編碼為 1
  • 1|1= 兩個隱性 - 重新編碼為 2

我嘗試了幾種方法。 我最近嘗試的事情已經接近了。 我嘗試了以下方法:

gg[grep("0|0", gg)] <- "0"

奇怪的是,這使得整個數據庫的所有值都為 0。 我認為這是因為它將 0|0 解釋為“如果值包含零或零,則重新編碼為零”(並且所有值都至少包含一個零)。

我想傳達的是,如果值以 EXACT 字符 0|0 開頭,則重新編碼為 1,如果它以 0|1 或 1|0 的 EXACT 字符開頭,則重新編碼為 1,如果它以 EXACT 開頭,則重新編碼為 2 1|1 的字符

試試下面的代碼

colSums(list2DF(strsplit(substr(gsub("\\|","",gg),1,2),""))=="1")

這使

0 1 1 2

虛擬數據

gg <- c('0|0:0,0:0:1,0,0','10:0,0:0:1,0,0','0|1:0,0:0:1,0,0','11:0,0:0:1,0,0')

稍作修改的選項是

rowSums(read.csv(text = sub("^(\\d)\\|?(\\d).*", "\\1,\\2", gg), 
         header = FALSE) == 1)
#[1] 0 1 1 2

數據

gg <- c('0|0:0,0:0:1,0,0','10:0,0:0:1,0,0','0|1:0,0:0:1,0,0','11:0,0:0:1,0,0')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM