R计数逗号和字符串的数量

时间:2012-03-12 16:57:33

标签: r nlp

我有一个字符串:

    str1 <- "This is a string, that I've written 
        to ask about a question, or at least tried to."

我将如何:

1)计算逗号数量

2)计算'-ion'的出现次数

有什么建议吗?

4 个答案:

答案 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