2014-01-13 10 views
2

Я хотел бы выделить символ вокруг символа, используя R и sub. Я пробовал много регулярных выражений, но я не получаю то, что хочу.Извлечь символ вокруг символа в R

Мой вектор:

c("G>GA", "T>A", "G>A", "G>A", "A>T", "CT>C", "T>C", "T>C", "A>T", "T>C", "T>A", "A>G", "CCGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA>C", "C>T", "T>A", "T>C", "T>G", "G>C", "T>G", "T>A", "G>A") 

мне нужен только один символ до и после >.

Моя лучшая попытка была:

sub("(.*?)>", ">", aa, perl = TRUE) 
+0

Вы можете использовать 'dput' свой вектор? – James

+0

... и ваш код? – hd1

+0

My best Try was sub ("(. *?)>", ">", Aa, perl = TRUE) – user3186183

ответ

9

Вы должны использовать группы захвата в своем регулярном выражении:

vec <- c("G>GA", "T>A", "G>A", "G>A", "A>T", "CT>C", "T>C", "T>C", "A>T", "T>C", "T>A", "A>G", "CCGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA>C", "C>T", "T>A", "T>C", "T>G", "G>C", "T>G", "T>A", "G>A") 
> sub(".*(.)>(.).*","\\1\\2",vec) 
[1] "GG" "TA" "GA" "GA" "AT" "TC" "TC" "TC" "AT" "TC" "TA" "AG" "AC" "CT" "TA" 
[16] "TC" "TG" "GC" "TG" "TA" "GA" 

В словах регулярное выражение соответствует чему-либо ноль или более раз .* затем захватить следующий символ (.) затем сопоставьте знак больше >, затем запишите следующий символ (.) и затем сопоставьте что-нибудь ноль или более раз в конце .*. Замените все это двумя захваченными символами \\1\\2.

+0

Спасибо! Я просто редактирую с помощью: sub (". * (.)> (.).* "," \\ 1> \\ 2 ", vec) – user3186183

+1

@ user3186183 О, я неправильно понял, что вы хотели. Этого будет достаточно для этого:' sub (". * (.>.). *", "\ \ 1 ", vec)'. – James

+2

Может быть, узкий '.' до' [AZ] ', поскольку все строки используют только заглавные буквы. – tenub

5

Обеспечить воспроизводимый пример

> x = c("A>G", "AT>GC") 

Найти индекс символа, вы заинтересованы в (использовании fixed=TRUE, потому что вы на самом деле не ищете регулярное выражение).

> i = regexpr(">", x, fixed=TRUE) 

Затем извлеките предшествующее и/или следующий символ

> substr(x, i-1, i-1) 
[1] "A" "T" 
> substr(x, i+1, i+1) 
[1] "G" "G" 

или получите последовательность

> substr(x, i-1, i+1) 
[1] "A>G" "T>G" 

Может быть, ваш воспроизводимый пример включает крайние случаи

> x = c("A>G", "AT>GC", "", ">G", "A>", ">", NA) 

и затем мо нужна ли обработка?

0

Похоже, вы пытаетесь получить ссылку и альтернативные аллели? Только поиск одного символа предполагает, что вас интересуют только SNP? Вы можете использовать strsplit для генерации фрейма данных ref и alt alleles.

test <- c("G>GA", "T>A", "G>A", "G>A", "A>T", "CT>C", "T>C", "T>C", "A>T", "T>C", "T>A", "A>G", "CCGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA>C", "C>T", "T>A", "T>C", "T>G", "G>C", "T>G", "T>A", "G>A") 
Alleles <- data.frame(t(data.frame(sapply(test, function(x) strsplit(x,split=">")))),row.names=NULL,stringsAsFactors=F) 
colnames(Alleles) <- c("Ref","Alt") 
Alleles$bases <- apply(Alleles,1,function(x) sum(length(unlist(strsplit(x[1],split=""))),length(unlist(strsplit(x[2],split=""))))) 
SNPs <- Alleles[Alleles$bases == 2,] 

Просто взятие единственной базы с обеих сторон замены (>) приведет к неправильной генетической информации. Вариант «CCGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA> C» будет уменьшен до «A> C» - он выглядит как простой SNP, но совпадает с удалением последних 38 баз «CGCCGCGGCCGCCGTCTTCCACCAACAACATGGCGGA> -».

Это вы, что искали?