使用R语言识别字符串中连续出现的特定字母组合

6

我希望确定下面数据框中的字符串列在前20个字符中是否至少重复了5次字母“V”或“G”。

示例数据:

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

例如,第一行字符串的前20个字符位置中包含“VVVVG”。同样,第三行字符串中包含“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
也许 data$result <- grepl('(V|G){5,}', substr(data$string, 1,20)) - akrun
谢谢@akrun,它运行良好。 - Veerendra Gadekar
如果前20个字符中只有 VVVVV 而没有任何 'G',那该怎么办? - akrun
无论如何都应该报告。 - Veerendra Gadekar
2个回答

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只是创建一个新的数据框,其中包含添加或修改的列。

编辑:对Matthew的创意答案进行一些基准测试:

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个重复,那么时间非常接近。


4

如果不用 substr,还有另一种选择:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接