2014-04-28 19 views
0

我有一個包含一列(SNP)一個數據幀(行程)。它看起來像這樣(但時間越長,它擁有192個等級):在R中,如何將正則表達式應用於包含模式的字符串的特定部分?

SNP 
C[T->C]T 
C[G->C]A 
G[A->C]A 
C[T->C]C 
C[C->A]G 
T[G->A]C 
... 

我想要模式匹配,並根據以下標準代替:

gsub("G->T", "C->A", trip) 
gsub("G->C", "C->G", trip) 
gsub("G->A", "C->T", trip) 
gsub("A->T", "T->A", trip) 
gsub("A->G", "T->C", trip) 
gsub("A->C", "T->G", trip) 

而且,如果該模式的一個上市上面找到了,我想要包含它的字符串應用了額外的替換。即:

if ((grep(G->T|G->C|G->C|A->T|A->G|A->C), trip$SNP)==TRUE){ 
    substr(trip$SNP, 1,1) <- tr /ATCG/TAGC/; #incompatible perl syntax? 
    substr(trip$SNP, 8,8) <- tr /ATCG/TAGC/; 
    } 

如,如果任何這些圖案的 - G-> T,G-> C,G-> C,A-> T,A-> G,或A-> C- - 在行程$ SNP中的字符串中找到,根據此正則表達式替換該字符串中的第1個字符和第8個字符:tr/ATCG/TAGC /;

希望的輸出,具有變化以粗體:

SNP C [T-> C]Ť C [G-> C]甲 G [A-> C]甲 C [T-> C]ç C [C->甲; G T [G-> A]ç

到:

SNP C [T-> C]Ť G [C-> G] Ť C [T-> G]Ť ç [T-> C]Ç C [C->甲; G A [C-> T]ģ

是否有一個更優雅的方式來做到這一點?

+1

我並不完全明白你在做什麼('TR/ATCG /湘火炬/'那裏是你的報價嗎?),但我99.9%肯定它會工作到粘貼'到字符串時,你要做的第一'gsub'然後用%s''sprintf'以後插入你想要的東西。 –

回答

0
SNP <- as.character(trip$SNP) 
SNP 
[1] "C[T->C]T" "C[G->C]A" "G[A->C]A" "C[T->C]C" "C[C->A]G" "T[G->A]C" 
i <- grep("(A|G)->", SNP) 
SNP[i] <- chartr("ACGT", "TGCA", SNP[i]) 
SNP 
[1] "C[T->C]T" "G[C->G]T" "C[T->G]T" "C[T->C]C" "C[C->A]G" "A[C->T]G" 
0

有可能是添加在包裝上要做到這一點更好,更快,但這樣的工作(我不認爲我有你想要什麼,但它足夠接近,你可以爲你以後適應)。請注意,前14行只是重新處理您的數據,解決方案只有幾行。

dat <- read.table(text="trip 
C[T->C]T 
C[G->C]A 
G[A->C]A 
C[T->C]C 
C[C->A]G 
T[G->A]C", header=TRUE, stringsAsFactors = FALSE) 

replace <- matrix(c("G->T", "%s[C->A]%s", 
"G->C", "%s[C->G]%s", 
"G->A", "%s[C->T]%s", 
"A->T", "%s[T->A]%s", 
"A->G", "%s[T->C]%s", 
"A->C", "%s[T->G]%s"), ncol=2, byrow=TRUE) 


for(i in 1:nrow(replace)) { 
    dat$trip[grepl(replace[i, 1], dat$trip)] <- replace[i, 2] 
} 

sprintf(dat$trip, "/ATCG/TAGC/", "/ATCG/TAGC/") 

## [1] "C[T->C]T"      "/ATCG/TAGC/[C->G]/ATCG/TAGC/" 
## [3] "/ATCG/TAGC/[T->G]/ATCG/TAGC/" "C[T->C]C"      
## [5] "C[C->A]G"      "/ATCG/TAGC/[C->T]/ATCG/TAGC/" 
+0

這個成功替換[]之間的字符串,但我的輸出包含更換行%S。頭(測試$ SNP) [1] 「C [T-> C] T」 「%S [C-> G]%s」 時 「%S [T-> G]%S」「C [T-> C] C」 「C [C-> A] G」 「%s的[C-> T]%的」 – soosus

+0

那麼你沒有做'sprintf'最後一步,在任何情況下你所花時間問問題而不是花時間讓原始問題更清楚。我對你想要的東西很朦朧。你最好的選擇是顯示上面所需的輸出。並確保你發佈的數據看起來像你正在使用的數據。 –

+0

我確實使用sprintf,無濟於事。我已經用期望的輸出更新了這篇文章。 「tr/ATCG/TAGC /」是一個perl正則表達式,用A代替A,T代表A,等等。我只需要一種方法在R中完成它。 – soosus

相關問題