【问题标题】:How to count string occurrences in another string in base R?如何计算基本 R 中另一个字符串中的字符串出现次数?
【发布时间】:2019-06-25 17:38:28
【问题描述】:

我只是想计算一个字符串的出现次数,例如'xy',在另一个字符串中,例如'kxyloixyea',不使用任何额外的库。

列和数据框有很多问题和答案,这可能就是为什么我找不到这个最简单的基本问题的答案。 (这是该帖子被无理标记为重复的许多相关帖子之一:How to calculate the number of occurrence of a given character in each row of a column of strings? 这又与数据帧和向量有关,所以我看不到适合我的“字符串中的字符串”问题的答案。)

我想出了这个可能太复杂的解决方案:

lengths(gregexpr(str_to_count, str_to_search, fixed = TRUE))
# as e.g.:
lengths(gregexpr('xy', 'kxyloixyea', fixed = TRUE))
# correctly returns 2

这很适合我的目的,但我无法想象没有更简单的方法(例如 Python 中的'kxyloixyea'.count('xy'));但我就是找不到。

另外,仅供参考,当出现为零时,这不起作用,然后它再次返回 1。在我的特定函数中,这永远不会发生,但仍然很高兴看到一个解决方案也涵盖了这一点(没有额外的复杂性) .

(注意:fixed = TRUE 绝非偶然,我不想要正则表达式。)


这是另一个解决方案:

str_to_count = 'xy'
str_to_search = 'kxyloixyea'
lengths(strsplit(str_to_search, str_to_count, fixed = TRUE)) - 1

这不会发生,但当str_to_search 为空("")时它不起作用。而且,它看起来并不比上面那个好多少。

这是一个处理空str_to_search的修改版本:

lengths(strsplit(paste0(str_to_search, str_to_count), str_to_count, fixed = TRUE)) - 1

再一次,对于这样一个简单的问题似乎很荒谬。

【问题讨论】:

  • 如果没有出现,您的代码将无法工作。您可以强制至少出现一次,然后减去 1。作为一个小的改进,使用 lengthss 来避免 [[1]]。 lengths(gregexpr('xy', paste0('kxyloixyea', 'xy'), fixed = TRUE)) - 1
  • 酷,感谢您的提示!我编辑到lengths。关于零发生,您也完全正确,但它永远不会发生在我的函数中,所以对我来说这不是问题。

标签: r regex string count


【解决方案1】:

以下代码适用于您描述的每种情况(不需要像“-1”这样的技巧):

str_to_count = "xy"           #setting variables
str_to_search = "kxyloixyea"

lengths(regmatches(str_to_search, gregexpr(str_to_count, str_to_search, fixed = TRUE)))

【讨论】:

  • 酷。仍然不是超级简单(可能没有这样的解决方案),但确实比之前提出的更干净。顺便说一句,我很好奇这些不同方法的时间性能如何——以防将来有人有时间这样做。
猜你喜欢
  • 2011-07-01
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2014-05-26
  • 2012-10-03
  • 1970-01-01
相关资源
最近更新 更多