2014-02-18 35 views
0

我有一個令人費解的問題串,我希望我可以很容易解釋它...不斷增加給定不同的,如果else語句[R​​]

,我有以下數據:

CHROM POS  REF SNP   INDEL 
5  290  A  --|T|--|-- 0 
5  890  A  A|T|--|G  0 
7  672  A  A|--|C|-- +C,+CC  
9  459  G  A|T|--|G  -C  

我想創建一個ALT變量,所以我最終可以通過VCFtools來運行它。但是,我並不完全知道如何通過不斷添加變量來創建變量,當且僅當某個語句被滿足時。

例如:

第一列很容易,ALT只是T;但是我只想將T粘貼到ALT列中,而不添加「|」要麼 」 - 」。第二個稍有不同,我不想將A添加到ALT變量,只是因爲它在SNP條目下出現,但添加了T和G,並用列分隔。

所以,實質上,我想要添加每個字母到ALT變量只有當它不等於REF變量,它不等於「 - 」。

我已經先行一步,分裂SNP列了如下:

m$A <- sapply(strsplit(as.character(mito$SNP),"\\|"),function(x) x[1]) 
m$T <- sapply(strsplit(as.character(mito$SNP),"\\|"),function(x) x[2]) 
m$C <- sapply(strsplit(as.character(mito$SNP),"\\|"),function(x) x[3]) 
m$G <- sapply(strsplit(as.character(mito$SNP),"\\|"),function(x) x[4]) 

但是從這裏有點卡住。我還遇到了「+ C,+ CC」和「-C」......的問題,這些SNP列中的字母將被忽略,但REF和ALT會變成:「A」和「AC,ACC」和「GC」和「G」。我也分裂了這一點:

m$indel1 <- sapply(strsplit(as.character(mito$INDEL),","),function(x) x[1]) 
m$indel2 <- sapply(strsplit(as.character(mito$INDEL),","),function(x) x[2]) 

如果這沒有任何意義;這裏是我想什麼不同的選項是:

CHROM POS  REF SNP   INDEL ALT 
5  290  A  --|T|--|-- 0  T 
5  890  A  A|T|--|G  0  T,G 
7  672  A  A|--|C|-- +C,+CC AC,ACC  
9  459  GC  A|T|--|G  -C  G 

我只包含上面的例子,但在文件中的這一切不同的組合。這可以在R中完成,還是會變得非常複雜。

感謝提前...

注1:

首先,道歉,如果這不是明顯的在我的查詢與開始以上。並感謝那些迄今爲止幫助過的人。根據要求,ALT變量會根據INDEL前面是否有「 - 」符號或「+」符號而改變INDEL(即,這不會遵循與SNP大部分相同的規則行)。

例如:

  1. 「-C」(或只要有一個 「 - 」 號),如上所述,REF需要成爲REF + INDEL和ALT成爲REF(由分離的逗號,如果需要的話):

    CHROM POS  REF SNP   INDEL ALT 
    9  459  GC  A|T|--|G  -C  G 
    
  2. 如果有一個 「+」 號(無論是+ C,+ CC或+ GGG或別的東西),REF保持不變,但ALT變成REF + INDEL(如果需要,用逗號分隔):

    CHROM POS  REF SNP   INDEL ALT 
    7  672  A  A|--|C|-- +C,+CC AC,ACC  
    9  987  T  --|T|C|-- +GGG  TGGG 
    
+0

這是一個不尋常的期待VCF,什麼程序進行呢?也許你應該只使用GATK之類的東西,默認情況下它會以你想要的格式輸出VCF。 – JeremyS

+0

這不是一個VCF ...我們想要將TXT轉換爲VCF(可以這樣做) – user2726449

+0

對不起,如果我錯過了某些東西,但是在那裏,還有'INDEL'值有兩個'-'或者' +'和'-'?即如'+ C,-CC'或'-C,-G'。如果是這樣的話,在這些情況下會發生什麼情況以「REF」和「ALT」? –

回答

1

對於邏輯的第一部分,像這樣的工作:

mito <- read.table(text="CHROM POS  REF SNP   INDEL 
5  290  A  --|T|--|-- 0 
5  890  A  A|T|--|G  0 
7  672  A  A|--|C|-- +C,+CC 
9  459  G  A|T|--|G  -C",header=TRUE,stringsAsFactors=FALSE) 

每個字母添加到ALT變量,只有當它不等於REF變量及其不等於' - '「。

SNPlist <- strsplit(mito$SNP,"\\|") 
output <- Map(function(x,y) x[x!=y & x!="--"] , SNPlist, mito$REF) 
mito$alt <- sapply(output,paste,collapse=",") 
mito 

# CHROM POS REF  SNP INDEL alt 
#1  5 290 A --|T|--|--  0 T 
#2  5 890 A A|T|--|G  0 T,G 
#3  7 672 A A|--|C|-- +C,+CC C 
#4  9 459 G A|T|--|G  -C A,T 
0

你可以試試這個:

library(stringr) 
snp <- str_extract_all(string = df$SNP, pattern = "[[:alpha:]]") 

snp2 <- mapply(FUN = function(x, y) x[x != y], x = snp, y = df$REF) 

df$ALT <- lapply(snp2, function(x) paste(x, collapse = ",")) 

df$ALT[df$INDEL == "+C,+CC"] <- "AC,ACC" 
df$ALT[df$INDEL == "-C"] <- "G" 

df 

# CHROM POS REF  SNP INDEL ALT 
# 1  5 290 A --|T|--|--  0  T 
# 2  5 890 A A|T|--|G  0 T,G 
# 3  7 672 A A|--|C|-- +C,+CC AC,ACC 
# 4  9 459 G A|T|--|G  -C  G 
+0

很好......但如果這是一個大文件,所有的indels將不得不分開進行。另外,#4的REF將需要成爲GC。我假設需要建立另一個模式(或兩個模式)來標記具有「 - 」或「+」的那些模式......我的邏輯是否有意義?附:不需要爲我做這件事,但只是想知道我是否在正確的道路上......如果是這樣,大概可以弄清楚(或不)。再次感謝。 – user2726449

+0

我認爲你需要澄清你的問題中的'INDEL'問題。如問題所述,似乎只需要處理兩個'INDEL'情況(對於INDEL爲「+ C,+ CC」或「-C」的行,將ALT更改爲「AC,ACC」和「G」)。根據'INDEL'變量改變'REF'變量也沒有問題,但我的印象是這是主要關注的結果'ALT'變量。 – Henrik

+0

True ...但是當有INDEL時,ALT(和REF)變量將需要相應地改變。例如。對於「-C」(或任何有「 - 」符號的地方),如上所述,REF需要變成GC,ALT變成G,但如果有「+」符號(無論是+ C,+ CC還是+ GGG),REF保持不變,但ALT變爲REF + indel。這只是上面的一個簡短例子,但是這些文件可能會變大(使用250K +行)......所以能夠以這種方式自動完成此操作將是理想的。 – user2726449

2

我試過的東西有點幼稚-and恐怕沒那麼effcient-以我對你做了數據幀的任意推斷。當然,如果我有任何錯誤,它可能會改變。無論如何,我希望這是有幫助的。

#> DF 
# CHROM POS REF  SNP INDEL 
#1  5 290 A --|T|--|--  0 
#2  5 890 A A|T|--|G  0 
#3  7 672 A A|--|C|-- +C,+CC 
#4  9 459 G A|T|--|G  -C 
#5  3 554 T A|T|--|G -GG,-A 
#6  9 987 T --|T|C|-- +GGG 
#7  21 214 G A|T|--|G  0 
#8  1 145 G G|--|--|G  0 
#9  3 554 T,C A|T|--|G -GG,-A 
#10  7 672 A,T A|--|C|-- +C,+CC 

而我認爲將是解決辦法:

ff = function(xrow) { 
    ref = as.character(xrow[3]) 
    snp = as.character(xrow[4]) 
    indel = as.character(xrow[5]) 

    if(indel == "0") { 
     alt = gsub(paste(ref, "|\\||--", sep = ""), "", snp) 
     if(nchar(alt) > 1) 
      alt = paste(strsplit(alt, "", fixed = T)[[1]], collapse = ",") 
    } 
    else { 
     indels = strsplit(indel, ",", fixed = T)[[1]] 

     if(grepl("-", indels[1], fixed = T)) { 
     alt = ref 
     ref = paste0(strsplit(ref, ",", fixed = T)[[1]], 
         gsub("-", "", indels, fixed = T), collapse = ",") 
     } 
     if(grepl("+", indels[1], fixed = T)) { 
     alt = paste0(strsplit(ref, ",", fixed = T)[[1]], 
         gsub("+", "", indels, fixed = T), collapse = ",") 
     } 
    }  

    return(cbind(CHROM = xrow[1], POS = xrow[2], REF = ref, 
       SNP = snp, INDEL = indel, ALT = alt)) 
} 
as.data.frame(t(apply(DF, 1, ff))) 
# V1 V2  V3   V4  V5  V6 
#1 5 290  A --|T|--|--  0  T 
#2 5 890  A A|T|--|G  0 T,G 
#3 7 672  A A|--|C|-- +C,+CC AC,ACC 
#4 9 459  GC A|T|--|G  -C  G 
#5 3 554 TGG,TA A|T|--|G -GG,-A  T 
#6 9 987  T --|T|C|-- +GGG TGGG 
#7 21 214  G A|T|--|G  0 A,T 
#8 1 145  G G|--|--|G  0  
#9 3 554 TGG,CA A|T|--|G -GG,-A T,C 
#10 7 672 A,T A|--|C|-- +C,+CC AC,TCC 

DF

structure(list(CHROM = c("5", "5", "7", "9", "3", "9", "21", 
"1", "3", "7"), POS = c("290", "890", "672", "459", "554", "987", 
"214", "145", "554", "672"), REF = c("A", "A", "A", "G", "T", 
"T", "G", "G", "T,C", "A,T"), SNP = c("--|T|--|--", "A|T|--|G", 
"A|--|C|--", "A|T|--|G", "A|T|--|G", "--|T|C|--", "A|T|--|G", 
"G|--|--|G", "A|T|--|G", "A|--|C|--"), INDEL = c("0", "0", "+C,+CC", 
"-C", "-GG,-A", "+GGG", "0", "0", "-GG,-A", "+C,+CC")), .Names = c("CHROM", 
"POS", "REF", "SNP", "INDEL"), row.names = c(NA, 10L), class = "data.frame") 
+0

這真是太棒了。我不知道它可以寫成這樣一種可解釋的方式(我假設如果有更有效的方式來寫它,我不會理解它)。這正是我所需要的。謝謝 – user2726449

+0

@ user2726449:不客氣!很高興我能幫上忙!我擔心我會誤解一些東西。 –