在R中,如何将正则表达式应用于包含模式的字符串的特定部分?

时间:2014-04-28 13:37:05

标签: regex r substring

我有一个包含列( SNP )的数据框(行程)。它看起来像这样(但更长,它有192个级别):

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- -is在trip $ SNP中的字符串中找到,根据此正则表达式替换该字符串中的第1个和第8个字符:tr / ATCG / TAGC /;

所需输出,粗体更改:

SNP C [T-&以及c] T ... C [G-&GT; C]甲 G [A-&GT; C]甲 C [T-&GT; C]Ç C [C-&gt;一种; G T [G-&gt;一种]ç

为:

SNP C [T-&以及c] T ... 的 G [C-&GT; G]Ť C [T-&GT; G]Ť C [T-&GT; C]Ç C [C-&gt;一种; G 的 A [C-&GT; T]ģ

有更优雅的方法吗?

2 个答案:

答案 0 :(得分: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/"

答案 1 :(得分: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"