【问题标题】:Counting endmarks in R在 R 中计算结束标记
【发布时间】:2012-03-26 06:46:02
【问题描述】:

我有一串句子,想计算所有我认为是结束标记的句子。

这些结束标记包括:。 ? ! * _

[所以句号、问号、感叹号、星号或下划线]

我希望以最快的方式使用基数 R 来计算这些出现次数。例如,以下字符串的计数为 6。

x <- "I like to play.  Do you?  Yes I do!  Go*  I didn't say it, but will. I wanted to but_"

这个字符串的计数为 4:

y <- "I like it!  Do you?  Look*  Where are you go_"

解决方案应该使用 base R,因为这是一个包。提前谢谢你。

【问题讨论】:

    标签: regex r


    【解决方案1】:

    我不确定这是否是最快的方式,但很简单:

    > x <- "I like to play.  Do you?  Yes I do!  Go*  I didn't say it, but will. I wanted to but_"
    > y <- "I like it!  Do you?  Look*  Where are you go_"
    > 
    > length(gregexpr("[.?!*_]", x)[[1]])
    [1] 6
    > length(gregexpr("[.?!*_]", y)[[1]])
    [1] 4
    

    更新

    gregexpr 如果没有匹配则返回-1,所以你需要检查它。这是正确的:

     sum(gregexpr("[.?!*_]", x)[[1]] > 0)
    

    【讨论】:

    • 我刚试过,效果很好。就我的目的而言,它非常快。我会尽快接受。谢谢+1
    • 除此之外,您还可以同时执行这两个操作:sapply(gregexpr("[.?!*_]", c(x, y)), length)。
    • 鉴于 kohske 的更新,我也完全忽略了,你可以试试这个: sapply(gregexpr("[.?!*_]", c(x, y, "this has no match" )), 函数(elem) 长度(elem[elem != -1]))
    • @BryanGoodrich 我认为 `function(elem) sum(elem != -1)` 会更快。不过差异可能非常小。
    • 我同意。它节省了不进行向量搜索来子集列表元素的时间。相反,您将 TRUE 与元素上的适当布尔向量相加(TRUE = 1,为我们提供准确的计数)。
    【解决方案2】:

    查看 stringr:::string_count。在你的包中导入其他有用的功能是公平的。

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多