使用 R 识别字符串中连续出现的一段特定字母
Identify continuously occurring stretch of specific letters in a string using R
我想确定下面数据框中的字符串列是否在字符串的前 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
结合字符 class 匹配 "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 次重复,则时间非常接近。
另一个选项,没有substr
:
within(data, result<-grepl('^.{,15}[VG]{5,}', string))
我想确定下面数据框中的字符串列是否在字符串的前 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
结合字符 class 匹配 "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 次重复,则时间非常接近。
另一个选项,没有substr
:
within(data, result<-grepl('^.{,15}[VG]{5,}', string))