计算给定值的出现次数

时间:2014-07-20 10:38:31

标签: r

我有一个字符串,需要计算一个必须出现的给定值的出现次数。我试图从stringr包中获取帮助,但每次找到值/模式时它都会计数。例如,假设我们必须计算" 213"在字符串" 2132132132137889213",然后我需要的输出是4但是,在使用stringr_count函数后我得到5。请帮忙。

2 个答案:

答案 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