Определите постоянно встречающееся растяжение определенных букв в строке с помощью R

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

Пример данных:

 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

person Veerendra Gadekar    schedule 04.06.2015    source источник
comment
Возможно data$result <- grepl('(V|G){5,}', substr(data$string, 1,20))   -  person akrun    schedule 04.06.2015
comment
Спасибо @akrun, все работает   -  person Veerendra Gadekar    schedule 04.06.2015
comment
Что делать, если в первых 20 символах есть только VVVVV и нет ни одной буквы «G»?   -  person akrun    schedule 04.06.2015
comment
в любом случае надо сообщить   -  person Veerendra Gadekar    schedule 04.06.2015


Ответы (2)


Похож на Акруна

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 просто создает новый фрейм данных с добавленными или измененными столбцами.


РЕДАКТИРОВАТЬ: некоторые ориентиры против творческого ответа Мэтью:

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 повторений рядом с передней частью строки.

person BrodieG    schedule 04.06.2015

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

within(data, result<-grepl('^.{,15}[VG]{5,}', string))
person Matthew Plourde    schedule 04.06.2015