计算R中长字符串中的短字符串数

时间:2016-05-05 14:12:03

标签: r

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

c<-"abcabcdabcdeabcdefghijkabcdabcaba"

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

3 个答案:

答案 0 :(得分:3)

1)gregexpr 首先将"abcd"粘贴到c,以便至少有1个匹配。 (这是必需的,因为gregexpr对于没有匹配的c的任何组件而不是零长度数字向量返回-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)regmatches

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

以下是两个相同的例子:

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

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

答案 1 :(得分:1)

以下是使用基础R 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]]的替代方法是{{1] }。

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

答案 2 :(得分:1)

使用库*animated:YES*,您可以按照以下方式执行此操作(在较大的集合上,它将非常快速且高效):

stringr

这将对数据框的一列起作用,如下所示:

library(stringr)
c <- "abcabcdabcdeabcdefghijkabcdabcaba"
c
[1] "abcabcdabcdeabcdefghijkabcdabcaba"

str_count(c, 'abcd')
[1] 4