【问题标题】:Count the maximum of consecutive letters in a string计算字符串中连续字母的最大值
【发布时间】:2019-04-30 11:01:55
【问题描述】:

我有这个向量:

vector <- c("XXXX-X-X", "---X-X-X", "--X---XX", "--X-X--X", "-X---XX-", "-X--X--X", "X-----XX", "X----X-X", "X---XX--", "XX--X---", "---X-XXX", "--X-XX-X")

我想检测出现 X 的最大连续次数。所以,我预期的向量是:

4, 1, 2, 1,2, 1, 2, 1, 2, 2, 3, 2

【问题讨论】:

  • 也可以sapply(gregexpr("X+", vector), function(x) max(attr(x, "match.length")))

标签: r regex string string-matching stringr


【解决方案1】:

这里有几个tidyverse 替代方案:

map_dbl(vector, ~sum(str_detect(., strrep("X", 1:8))))
# [1] 4 1 2 1 2 1 2 1 2 2 3 2
map_dbl(strsplit(vector,"-"), ~max(nchar(.)))
# [1] 4 1 2 1 2 1 2 1 2 2 3 2

【讨论】:

    【解决方案2】:

    在 gsubfn 中使用 strapply 提取 X... 子字符串,将 nchar 应用于每个子字符串,以计算其字符数,生成长度向量列表。 sapply max 函数每个这样的向量。

    library(gsubfn)
    
    sapply(strapply(vector, "X+", nchar), max)
    ## [1] 4 1 2 1 2 1 2 1 2 2 3 2
    

    【讨论】:

      【解决方案3】:

      这是一种略有不同的方法。我们可以在任意数量的破折号上拆分输入向量中的每个项。然后,找到长度最大的子串。

      sapply(vector, function(x) {
          max(nchar(unlist(strsplit(x, "-+"))))
      })
      
      XXXX-X-X ---X-X-X --X---XX --X-X--X -X---XX- -X--X--X X-----XX X----X-X 
             4        1        2        1        2        1        2        1 
      X---XX-- XX--X--- ---X-XXX --X-XX-X 
             2        2        3        2 
      

      我怀疑X 真的只是代表任何非破折号字符,所以我们不需要明确检查它。如果您确实真的只想计算X,那么我们可以尝试在计算之前删除所有非X 字符:

      sapply(vector, function(x) {
          max(nchar(gsub("[^X]", "", unlist(strsplit(x, "-+")))))
      })
      

      【讨论】:

      • 不使用unlistsapply(strsplit(vector, "-+"), function(x) max(nchar(x)))
      【解决方案4】:

      在基数 R 中,我们可以将每个 vector 拆分为单独的字符,然后使用 rle 找到“X”的 max 连续长度。

      sapply(strsplit(vector, ""), function(x) {
         inds = rle(x)
         max(inds$lengths[inds$values == "X"])
      })
      
      #[1] 4 1 2 1 2 1 2 1 2 2 3 2
      

      【讨论】:

      • 如果您在gregexpr 的结果上使用diff,您可以在不拆分的情况下执行相同的操作(稍加注意;-)):sapply(vector, function(x) {inds=rle(diff(gregexpr("X", x)[[1]])); max(max(inds$lengths[inds$values==1]), 0)+1})
      猜你喜欢
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      相关资源
      最近更新 更多