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

标签 r substr stringr

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

样本数据:

 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

最佳答案

类似于阿克伦的

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 次重复,则时间非常接近。

关于r - 使用 R 识别字符串中连续出现的特定字母段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30647149/

相关文章:

mysql - R 中指向数据库的类似指针的变量

r - 如何从右到左拆分字符串,如 Python 的 rsplit()?

r - R3.0.3 和 R3.1.3 中的日期时间格式

java - 使用子字符串拆分字符串

mysql - 我想在 mysql 的 if 语句中使用用户 'substr'

PHP 问题 : strpos function not working

r - 如何通过分隔符拆分 r 中的字符串并丢弃最后两项?

r - 哪个正则表达式从文本中的引号中删除标点符号

r - 如何在超过 2^31 个观察值中使用 biglm

r - 用于删除所有包含 R 中数字的单词的正则表达式