R количество запятых и строки - PullRequest
8 голосов
/ 12 марта 2012

У меня есть строка:

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

Как мне:

1) подсчитать количество запятых

2) подсчитать вхождения '-ion'

Есть предложения?

Ответы [ 4 ]

19 голосов
/ 12 марта 2012

В пакете 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 
6 голосов
/ 12 марта 2012

Общая проблема математического текста требует регулярных выражений. В этом случае вы просто хотите сопоставить определенные символы, но функции для вызова одинаковы. Вы хотите 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]])

Если вы хотите сопоставлять только «ион» в конце слов, то вам нужны регулярные выражения. \b представляет границу слова, и вам необходимо избежать обратной косой черты.

gregexpr(
  "ion\\b", 
  "ionisation should only be matched at the end of the word", 
  perl = TRUE
)
3 голосов
/ 25 декабря 2014

Другой вариант - 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
3 голосов
/ 12 марта 2012

Это действительно адаптация ответа Ричи Коттона. Я ненавижу повторять одну и ту же функцию снова и снова. Этот подход позволяет вам задавать вектор терминов для сопоставления в строке:

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...