我有一个字符串:
str1 <- "This is a string, that I've written
to ask about a question, or at least tried to."
我将如何:
1)计算逗号数量
2)计算'-ion'的出现次数
有什么建议吗?
答案 0 :(得分:19)
stringr
包有一个函数str_count
,可以很好地为您完成此任务。
library(stringr)
str_count(str1, ',')
[1] 2
str_count(str1, 'ion')
[1] 1
编辑:
因为我很好奇:
vec <- paste(sample(letters, 1e6, replace=T), collapse=' ')
system.time(str_count(vec, 'a'))
user system elapsed
0.052 0.000 0.054
system.time(length(gregexpr('a', vec, fixed=T)[[1]]))
user system elapsed
2.124 0.016 2.146
system.time(length(gregexpr('a', vec, fixed=F)[[1]]))
user system elapsed
0.052 0.000 0.052
答案 1 :(得分:6)
计算文本的一般问题需要正则表达式。在这种情况下,您只想匹配特定字符,但要调用的函数是相同的。你想要gregexpr
。
matched_commas <- gregexpr(",", str1, fixed = TRUE)
n_commas <- length(matched_commas[[1]])
matched_ion <- gregexpr("ion", str1, fixed = TRUE)
n_ion <- length(matched_ion[[1]])
如果你只想在单词的末尾匹配“ion”,那么你需要正则表达式。 \b
表示单词边界,您需要转义反斜杠。
gregexpr(
"ion\\b",
"ionisation should only be matched at the end of the word",
perl = TRUE
)
答案 2 :(得分:3)
这确实是Richie Cotton的回答。我不想一遍又一遍地重复同样的功能。这种方法允许您提供一个术语向量以匹配字符串:
str1 <- "This is a string, that I've written to ask about a question,
or at least tried to."
matches <- c(",", "ion")
sapply(matches, function(x) length(gregexpr(x, str1, fixed = TRUE)[[1]]))
# , ion
# 2 1
答案 3 :(得分:3)
另一个选项是stringi
library(stringi)
stri_count(str1,fixed=',')
#[1] 2
stri_count(str1,fixed='ion')
#[1] 1
vec <- paste(sample(letters, 1e6, replace=T), collapse=' ')
f1 <- function() str_count(vec, 'a')
f2 <- function() stri_count(vec, fixed='a')
f3 <- function() length(gregexpr('a', vec)[[1]])
library(microbenchmark)
microbenchmark(f1(), f2(), f3(), unit='relative', times=20L)
#Unit: relative
#expr min lq mean median uq max neval cld
# f1() 18.41423 18.43579 18.37623 18.36428 18.46115 17.79397 20 b
# f2() 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 20 a
# f3() 18.35381 18.42019 18.30015 18.35580 18.20973 18.21109 20 b