10
votes

R Count Nombre de virgules et de chaîne

J'ai une chaîne: xxx

Comment if:

1) comptez le nombre de virgules

2) compter les occurrences de "-ion"

Toute suggestion?

r nlp

0 commentaires

4 Réponses :


6
votes

Le problème général du texte mathique nécessite des expressions régulières. Dans ce cas, vous voulez juste faire correspondre des caractères spécifiques, mais les fonctions à appeler sont les mêmes. Vous voulez GREGEXPR code>.

gregexpr(
  "ion\\b", 
  "ionisation should only be matched at the end of the word", 
  perl = TRUE
)


1 commentaires

Merci, cela fonctionne sans avoir à installer la bibliothèque stringr . Toutefois Notez que longueur (GREGEXPR (",", "pas de virgule", fixe = true) [[1]]) [[1]]) et longueur (GREGEXPR ("one, virgule" , corrigé = true) [[1]]) sont les deux 1. Nous devons donc vérifier que correspondant_commas [[[[1]] [1] est supérieur à 0.



26
votes

Le package stringr code> a une fonction str_count code> qui le fait pour vous gentiment.

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 


4 commentaires

Il est important de noter que le temps frappé pour GREGEXPR () arrive entièrement de paramètre fixe = t (ce qui n'est pas nécessaire ici (qui n'est pas nécessaire ici) . Vous voudrez peut-être ajouter les horaires de System.time (longueur (GREGEXPR ('A', VEC) [[[1]])) , qui devrait être presque identique à celles de str_count ( ) . Cela a du sens depuis str_count () est essentiellement un wrapper pour gregexpr () .


@ Josho'brien bon point. J'étais un peu surprise à quel point le GregeXPR était.


Moi aussi. C'est pourquoi j'ai vérifié. Je n'avais vraiment pas apprécié combien d'expressions régulières plus lentement sont assorties lorsque corrigé = true . Bon à savoir à ce sujet, alors merci d'avoir ajouté ces timings à votre message!


Dans un datable.table j-expression, vous pouvez faire dt [ n = str_count (str, 'a')] pour obtenir le numéro de 'A ' dans str pour chaque ligne, mais dt [ n = longueur (gregexpr (' a ', str)] ne fonctionne pas et la solution de contournement ( Filtre & Unlist ecriste ) prend une très longue période. Passer à str_count dans mon datable.table j-expression diminuait mon temps d'exécution de plusieurs heures à 30 minutes avec un grand jeu de données.



3
votes

C'est vraiment une adaptation de la réponse de Richie Cotton. Je déteste avoir à répéter la même fonction encore et encore. Cette approche vous permet de nourrir un vecteur de termes à correspondre dans la chaîne: xxx


1 commentaires

Encore une fois parce que j'étais curieux, vous pouvez également nourrir un vecteur de correspondances à str_count . str_count (str1, correspondances) retournera les mêmes 2 et 1.



3
votes

Une autre option est une autre option stringi xxx

référence xxx


0 commentaires