2015-06-04 2 views
6

Я хотел бы определить, если колонка строки в кадре данных ниже повторяет буквы «V» или «G» не менее 5 раз в течение первых 20 символов строка.Определить непрерывное растяжение определенных букв в строке с использованием R

Образец данных:

data = data.frame(class = c('a','b','C'), string = 
c("ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ", 
"AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD", 
"GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER")) 

Например строка в первой строке имеет «VVVVG» в течение первых 20 позиций символов. Точно так же строка в третьей строке имеет «VVGGV».

data 
# class             string 
#1  a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ 
#2  b  AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD 
#3  C  GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER 

Желательный результат должен выглядеть следующим образом:

# class             string result 
# 1  a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ TRUE 
# 2  b  AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD FALSE 
# 3  C  GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER TRUE 
+2

Авось '$ результате данных <- grepl ('(V | G) {5,}', зиЬзЬг (данные $ строка, 1,20))' – akrun

+0

Спасибо @akrun, он отлично работает –

+0

Что делать, если есть только 'VVVVV', а не« G »в первых 20 символах – akrun

ответ

5

Подобно Akrun-х

transform(data, result=grepl("[VG]{5,}", substr(string, 1, 20))) 

Производит

class             string result 
1  a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ TRUE 
2  b  AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD FALSE 
3  C  GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER TRUE 

Здесь мы используем grep в сочетании с классом символов, Матчи либо «G», либо «V» ([VG]) повторяется 5 или более раз ({5, }). transform просто создает новый фрейм данных с добавленными или измененными столбцами.


EDIT: некоторые ориентиры в отношении творческого ответа от Матфея:

set.seed(1) 
string <- vapply(
    replicate(1e5, sample(c("V", "G", "A", "S"), sample(20:300, 1), rep=T)), 
    paste0, character(1L), collapse="" 
) 
library(microbenchmark) 
microbenchmark(
    grepl("[VG]{5,}", substr(string, 1, 20)), 
    grepl("^.{,15}[VG]{5,}", string), 
    times=10 
) 

Производит:

Unit: milliseconds 
            expr  min  lq  mean 
grepl("[VG]{5,}", substr(string, 1, 20)) 131.6668 131.8343 133.6644 
     grepl("^.{,15}[VG]{5,}", string) 299.7326 300.4416 302.5065 

не был полностью уверен, что ожидать, но я предполагаю, что это имеет смысл, поскольку substr является очень проста в применении. Времена очень близки, если шаблон имеет 5 повторов вблизи передней части строки.

+0

Спасибо за тесты, очень полезно. –

4

Другой вариант, без substr:

within(data, result<-grepl('^.{,15}[VG]{5,}', string)) 
+1

хорошая альтернатива – BrodieG

+1

Очень хороший вариант. – akrun

Смежные вопросы