【问题标题】:R: Counting consecutive letters in a stringR:计算字符串中的连续字母
【发布时间】:2018-11-20 16:57:45
【问题描述】:

我目前在 R 中有一个如下所示的字符串:

df <- c ("BMMBMMBMMMMMBMMBM")

我需要确定 MM 在这个字符串中出现了多少次(在这个例子中是 4)。

我一直在使用str_count(df, "MM"),但这仅计算字符串中两个 M 相邻的次数(返回 5)。

任何帮助都会很棒...

谢谢!

【问题讨论】:

    标签: r string dataframe count


    【解决方案1】:

    这是一个没有正则表达式的基本 R 方法:

    with(rle(unlist(strsplit(x, ""))), sum(values == "M" & lengths >= 2))
    # [1] 4
    

    【讨论】:

      【解决方案2】:

      一种可能的方法是:

      stringr::str_count(df, "MM+")
      #output
      [1] 4
      

      + 表示一个或多个

      在基础 R 中:

      lengths(gregexpr("MM+", df))
      

      gregexpr返回一个列表,每个元素对应df的一个元素。 lengths 返回每​​个列表元素的长度。

      编辑:根据@docendo discimus 的评论,第二个选项有点危险,因为如果找不到字符串,它将返回1

      lengths(gregexpr("xyz+", df))
      #output
      1
      

      更安全的选择是:

      lapply(gregexpr("MM+", df), function(x) length(x[x > 0]))
      #output
      [[1]]
      [1] 4
      
      lapply(gregexpr("xyz+", df), function(x) length(x[x > 0]))
      #output
      [[1]]
      [1] 0
      

      【讨论】:

        【解决方案3】:

        基础解决方案:

        s <- "BMMBMMBMMMMMBMMBM"
        lengths(gregexpr("MM+", s))
        ## [1] 4
        

        请注意,问题中名为df 的输入是字符串,而不是数据框,并且c("X")"X" 相同,因此不需要c 和括号。

        【讨论】:

        • 如果没有进一步检查,如果根本找不到字符串,这可能会导致麻烦。
        • 如果有可能,请尝试lengths(gregexpr("MM+", paste("MM", s)))-1
        【解决方案4】:

        尝试以下模式:

        str_count(df,"(M)\\1+")
        

        这会将两个或多个 M 计为一个案例。 或者

        str_count(df,"M{2,}")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-30
          • 1970-01-01
          • 2015-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多