首页 文章

计算给定值的出现次数

提问于
浏览
1

我有一个字符串,需要计算给定值的出现次数,这些值必须显示为结果 . 我试图从stringr包中获取帮助,但每次找到值/模式时它都会计数 . 例如,假设我们必须在字符串“2132132132137889213”中计算“213”的外观,那么我需要的输出是4但是,在使用stringr_count函数后我得到5 . 请帮忙 .

2 回答

  • 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 返回发生模式的位置和找到的模式的字符数 . 在"(pattern)+"中包装模式意味着'find the repetitive pattern' . 比较以下两个:

    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 .

  • 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
    

相关问题