我有一个字符串列表:
> head(g_patterns_clean_strings)
[[1]]
[1] "1FAFA"
[[2]]
[1] "FA,TRFA"
[[3]]
[1] "FAEX"
我试图识别这些字符串中的特定模式,如下:
library(devtools)
g_patterns_clean <- source_gist("164f798524fd6904236a")[[1]]
g_patterns_clean_strings <- source_gist("af70a76691aacf05c1bb")[[1]]
FA_logic_vector <- grepl(g_patterns_clean_strings, pattern = "(FA)+")
FA_cluster <- subset(g_patterns_clean, FA_logic_vector)
我们现在要说检查字符串,其中"FA"
占字符串总长度的X%(例如"FA"
占每个字符串中字符的25%将匹配)。我怎么能做到这一点?
答案 0 :(得分:2)
以下是使用stringr
和来自%>%
的管道运算符magrittr
的方法。提供的函数采用字符串,模式和最小比例的向量,并返回与输入相同长度的逻辑向量,指示模式是否至少构成该比例。
library("magrittr")
library("stringr")
checkPatternProportion <- function(strings, pattern, proportion) {
strings %>%
str_extract_all(pattern) %>%
lapply(paste, collapse = "") %>%
{nchar(.) / nchar(strings) >= proportion}
}
用法:
set.seed(123)
myStrings <- replicate(100, c("AB", "FA", "GE", "DE") %>%
sample(sample(1:8), replace = TRUE) %>%
paste(collapse = ""))
head(myStrings, 10)
# [1] "GEFADE" "DEDEGEGE" "DEGEDEABFADEABFA" "FAFA" "DEDEFAGEABFAFA"
# [6] "GEABFAABFAGEFA" "DE" "DEABFAGEGEFAFADE" "ABDEGEAB" "FADEABABAB"
matches <- checkPatternProportion(myStrings, "FA", 0.25)
head(matches, 10)
# [1] TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE FALSE FALSE