我有一个字符串,需要计算一个必须出现的给定值的出现次数。我试图从stringr包中获取帮助,但每次找到值/模式时它都会计数。例如,假设我们必须计算" 213"在字符串" 2132132132137889213",然后我需要的输出是4但是,在使用stringr_count函数后我得到5。请帮忙。
答案 0 :(得分:3)
我不确定我的"正则表达式"技能,但希望你可以从中做出一些事情:
max_rep_pat = function(pat, text)
{
res = gregexpr(paste0("(", pat, ")+"), text)
sapply(res, function(x) max(attr(x, "match.length")) / nchar(pat))
}
max_rep_pat("213", c("2132132132137889213",
"21321321321378892132132132132132213213"))
#[1] 4 5
gregexpr
返回发生模式的位置以及找到的模式的字符数。将图案包装在"(图案)+"意味着找到重复的模式'。比较以下两个:
gregexpr("213", "2132132132137889213")
[[1]]
[1] 1 4 7 10 17
attr(,"match.length")
[1] 3 3 3 3 3
#attr(,"useBytes")
#[1] TRUE
gregexpr("(213)+", "2132132132137889213")
[[1]]
[1] 1 17
attr(,"match.length")
[1] 12 3
#attr(,"useBytes")
#[1] TRUE
在第一种情况下,它找到了每个" 213"并且每个匹配的长度只是模式的nchar
。在第二种情况下,它发现了每一个重复的模式" 213"我们看到重复的" 213"发生两次;第一次以12/3 = 4次重复,第二次以3/3 = 1次重复。使用max(attr(x, "match.length")) / nchar(pattern)
,我们得到了4。
答案 1 :(得分:2)
另一种方式是:
fun1 <- function(pat, text) {
max_rep_pat1 <- function(pat, text) {
text1 <- gsub(pat, paste(" ", pat, " "), text)
rl <- rle(scan(text = text1, what = "", quiet = T) == pat)
max(rl$lengths[rl$values])
}
setNames(mapply(max_rep_pat1, pat, text), NULL)
}
str1 <- c("2132132132137889213", "21321321321378892132132132132132213213")
str2 <- "213421342134213477"
fun1("2134", str2)
#[1] 4
fun1("213", str1)
#[1] 4 5