如何计算基数R中另一个字符串中出现的字符串?

时间:2019-06-25 17:38:28

标签: r regex string count

我只想计算一个字符串的出现次数,例如'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 = T)) - 1

这没有任何作用,但是在str_to_search为空("")时无效。而且,它看起来并不比上面的更好。

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

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

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

1 个答案:

答案 0 :(得分: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)))