【发布时间】:2016-05-05 14:12:03
【问题描述】:
假设我有一个长字符串,例如:
c<-"abcabcdabcdeabcdefghijkabcdabcaba"
我的问题是如何快速计算c 中确切的“abcd”数量。
【问题讨论】:
标签: r
假设我有一个长字符串,例如:
c<-"abcabcdabcdeabcdefghijkabcdabcaba"
我的问题是如何快速计算c 中确切的“abcd”数量。
【问题讨论】:
标签: r
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) 正则匹配
这是另一种方法。这种方法的优点是不匹配的情况不需要特殊的代码。同样,没有使用任何包。
这里有两个相同的例子:
lengths(regmatches(c, gregexpr("abcd", c)))
## [1] 4
lengths(regmatches(DF$c, gregexpr("abcd", DF$c)))
## [1] 4 4 0
【讨论】:
c,这是否不需要 apply 系列函数来计算每行的长度?
使用库stringr,您可以执行以下操作(在较大的集合上,它会相当快速和高效):
library(stringr)
c <- "abcabcdabcdeabcdefghijkabcdabcaba"
c
[1] "abcabcdabcdeabcdefghijkabcdabcaba"
str_count(c, 'abcd')
[1] 4
这将适用于数据框的列,如下所示:
df <- data.frame(txt = rep(c, 10))
df$abcd_count <- str_count(df$txt, 'abcd')
df
txt abcd_count
1 abcabcdabcdeabcdefghijkabcdabcaba 4
2 abcabcdabcdeabcdefghijkabcdabcaba 4
3 abcabcdabcdeabcdefghijkabcdabcaba 4
4 abcabcdabcdeabcdefghijkabcdabcaba 4
5 abcabcdabcdeabcdefghijkabcdabcaba 4
6 abcabcdabcdeabcdefghijkabcdabcaba 4
7 abcabcdabcdeabcdefghijkabcdabcaba 4
8 abcabcdabcdeabcdefghijkabcdabcaba 4
9 abcabcdabcdeabcdefghijkabcdabcaba 4
10 abcabcdabcdeabcdefghijkabcdabcaba 4
【讨论】:
这是一种使用基本 Rs 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]] 的替代方法是unlist。
此外,因为元素的数量比 abcd 模式的数量大 1,所以减去 1。
【讨论】: