2017-10-10 57 views
0

我有一個數據框,有幾個人作爲列,SNP作爲行。每列都有一個單一的等位基因(例如G或A或N(如果沒有被稱爲),每個SNP也有主要的和(單獨列)次要等位基因的列,我試圖將單個等位基因值轉換成雙等位基因值對於基於主要和次要等位基因列的每個值(因此,如果個體的等位基因是主要等位基因,我想將次要等位基因粘貼在空間分隔符之後,反之亦然)。如果缺失值(N)我想用0替換它0.這裏的想法是將這些數據格式化爲Plink。基於主要和次要等位基因列的單等位基因到雙等位基因

到目前爲止,我嘗試過使用ifelse函數但沒有成功。關於如何獲得biallelic值的任何建議在這裏?非常感謝!我已經包含了一個以我指的格式組成的數據組。現在AVE:

rs#  major minor ind1 ind2 ind3 ind4 
rs123456 A G  A  A  A  G 
rs123457 G C  C  G  C  G 
rs123458 C G  C  C  G  C 
rs123459 T A  A  T  N  T 

我想

rs  major minor ind1 ind2 ind3 ind4 
rs123456 A G  A G  A G  A G  G A 
rs123457 G C  C G  G C  C G  G C 
rs123458 C A  C A  C A  A C  C A 
rs123459 T A  A T  T A  0 0  T A 

謝謝! Rob

+0

爲什麼你必須依靠未成年人/專業?核苷酸總是有其補體嘌呤/嘧啶(不包括RNA)。生成它並將它們粘貼到一個字符串中應該是一件輕而易舉的事情。 –

+0

謝謝!我的例子並沒有做得很好,但在這種情況下,由於這些是單核苷酸多態性,它們並不一定遵循互補核苷酸規則,例如複製。我可以編輯它使其更加清晰。 – RobNewToR

+0

請顯示您期望的最複雜的例子。 –

回答

0

這是一種做事的方式。仔細檢查你的數據,並找到小/主要的補充。請注意,您的輸入和預期輸出不匹配。

xy <- read.table(text = "rs  major minor ind1 ind2 ind3 ind4 
rs123456 A G  A  A  A  G 
rs123457 G C  C  G  C  G 
rs123458 C G  C  C  G  C 
rs123459 T A  A  T  N  T", header = TRUE) 
xy 

out <- apply(xy, MARGIN = 1, FUN = function(x) { 
    findind <- grepl("^ind", names(x)) 
    x[x %in% x["major"] & findind] <- paste(x[x %in% x["major"] & findind], x["minor"]) 
    x[x %in% x["minor"] & findind] <- paste(x[x %in% x["minor"] & findind], x["major"]) 
    x[x %in% "N"] <- "0 0" 
    list(x) 
}) 
out <- sapply(out, "[", 1) 
as.data.frame(do.call(rbind, out)) 

     rs major minor ind1 ind2 ind3 ind4 
1 rs123456  A  G A G A G A G G A 
2 rs123457  G  C C G G C C G G C 
3 rs123458  C  G C G C G G C C G 
4 rs123459  T  A A T T A 0 0 T A 
+0

非常感謝! – RobNewToR