【问题标题】:Count number of short strings in a long string in R [duplicate]计算R中长字符串中短字符串的数量[重复]
【发布时间】:2016-05-05 14:12:03
【问题描述】:

假设我有一个长字符串,例如:

c<-"abcabcdabcdeabcdefghijkabcdabcaba"

我的问题是如何快速计算c 中确切的“abcd”数量。

【问题讨论】:

    标签: r


    【解决方案1】:

    1) gregexpr 首先将"abcd" 粘贴到c 上,以便至少有1 个匹配项。 (这是必需的,因为 gregexprc 的任何没有匹配项而不是零长度数字向量的分量返回 -1。)现在,gregexpr 返回一个列表,其分量是匹配项起始位置的数字向量c 的每个组件一个组件——在这种情况下,c 只有一个组件,但下面的代码更通用。现在找到gregexpr 结果的分量的长度并减去1 以考虑我们添加的额外abcd。没有使用任何包。

    示例 1

    lengths(gregexpr("abcd", paste(c, "abcd"))) - 1
    ## [1] 4
    

    注意:如果我们知道至少有一个匹配项,可以稍微简化为:lengths(gregexpr("abcd", c))

    示例 2

    这是另一个例子。这里DF 有 3 行,c 的对应组件有 4、4 和 0 次出现 "abcd"

    DF <- data.frame(c = c(c, c, "X")) # test input
    
    lengths(gregexpr("abcd", paste(DF$c, "abcd"))) - 1
    ## [1] 4 4 0
    

    2) 正则匹配

    这是另一种方法。这种方法的优点是不匹配的情况不需要特殊的代码。同样,没有使用任何包。

    这里有两个相同的例子:

    lengths(regmatches(c, gregexpr("abcd", c)))
    ## [1] 4
    
    lengths(regmatches(DF$c, gregexpr("abcd", DF$c)))
    ## [1] 4 4 0
    

    【讨论】:

    • 如果要匹配一列字符串而不是单个字符向量 c,这是否不需要 apply 系列函数来计算每行的长度?
    • 当没有“abcd”时,这似乎不正确。输出将是 1 而不是 0。 stringr::str_count 有效。
    • @Gopata,它也适用于列。见第二个例子。
    • @David Z,好点子。已修复。
    【解决方案2】:

    使用库stringr,您可以执行以下操作(在较大的集合上,它会相当快速和高效):

    library(stringr)
    c <- "abcabcdabcdeabcdefghijkabcdabcaba"
    c
    [1] "abcabcdabcdeabcdefghijkabcdabcaba"
    
    str_count(c, 'abcd')
    [1] 4
    

    这将适用于数据框的列,如下所示:

    df <- data.frame(txt = rep(c, 10))
    df$abcd_count <- str_count(df$txt, 'abcd')
    df
                                     txt abcd_count
    1  abcabcdabcdeabcdefghijkabcdabcaba          4
    2  abcabcdabcdeabcdefghijkabcdabcaba          4
    3  abcabcdabcdeabcdefghijkabcdabcaba          4
    4  abcabcdabcdeabcdefghijkabcdabcaba          4
    5  abcabcdabcdeabcdefghijkabcdabcaba          4
    6  abcabcdabcdeabcdefghijkabcdabcaba          4
    7  abcabcdabcdeabcdefghijkabcdabcaba          4
    8  abcabcdabcdeabcdefghijkabcdabcaba          4
    9  abcabcdabcdeabcdefghijkabcdabcaba          4
    10 abcabcdabcdeabcdefghijkabcdabcaba          4
    

    【讨论】:

      【解决方案3】:

      这是一种使用基本 Rs gsub 和 strsplit 的方法:

      # example
      temp <- "abcabcdabcdeabcdefghijkabcdabcaba"
      # substitute pattern for character not in string, here 9
      temp2 <- gsub("abcd", "9", temp)
      
      # split on 9, and count number of elements
      length(strsplit(temp2, split="9")[[1]]) - 1
      

      您需要[[1]],因为strsplit 旨在对字符串向量进行操作,这里向量的长度为1。在这种情况下,[[1]] 的替代方法是unlist

      此外,因为元素的数量比 abcd 模式的数量大 1,所以减去 1。

      【讨论】:

        猜你喜欢
        • 2014-06-04
        • 2017-07-09
        • 1970-01-01
        • 2020-11-28
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 2017-12-05
        • 2017-10-20
        相关资源
        最近更新 更多