假设我有一个长字符串,如:
c<-"abcabcdabcdeabcdefghijkabcdabcaba"
我的问题是如何快速计算c
中确切“abcd”的数量。
答案 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