使用R识别字符串中连续出现的特定字母段

Vee*_*kar 6 r substr stringr

我想确定下面数据框中的字符串列是否在字符串的前20个字符内至少重复5次字母"V"或"G".

样本数据:

 data = data.frame(class = c('a','b','C'), string =
 c("ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ",
 "AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD",
 "GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER"))
Run Code Online (Sandbox Code Playgroud)

例如,第一行中的字符串在前20个字符位置内具有"VVVVG".类似地,第三行中的字符串具有"VVGGV".

data
#  class                                                  string
#1     a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ
#2     b      AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD
#3     C       GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER
Run Code Online (Sandbox Code Playgroud)

所需的输出应如下所示:

#   class                                                  string result
# 1     a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ   TRUE
# 2     b      AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD  FALSE
# 3     C       GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER   TRUE
Run Code Online (Sandbox Code Playgroud)

Bro*_*ieG 5

与Akrun相似

transform(data, result=grepl("[VG]{5,}", substr(string, 1, 20)))
Run Code Online (Sandbox Code Playgroud)

产生

  class                                                  string result
1     a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ   TRUE
2     b      AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD  FALSE
3     C       GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER   TRUE
Run Code Online (Sandbox Code Playgroud)

这里我们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
)
Run Code Online (Sandbox Code Playgroud)

生产:

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
Run Code Online (Sandbox Code Playgroud)

不完全确定会发生什么,但我认为这很有意义,因为substr申请非常简单.如果模式在字符串前面附近有5次重复,则时间非常接近.