J'ai une chaîne: Comment if: p> 1) comptez le nombre de virgules p> 2) compter les occurrences de "-ion" p> Toute suggestion? P> p>
4 Réponses :
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
)
Merci, cela fonctionne sans avoir à installer la bibliothèque stringr code>. Toutefois Notez que
longueur (GREGEXPR (",", "pas de virgule", fixe = true) [[1]]) [[1]]) code> et
longueur (GREGEXPR ("one, virgule" , corrigé = true) [[1]]) code> sont les deux 1. Nous devons donc vérifier que
correspondant_commas [[[[1]] [1] code> est supérieur à 0.
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Â
Il est important de noter que le temps frappé pour GREGEXPR () code> arrive entièrement b> de paramètre
fixe = t code> (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]])) CODE>, qui devrait être presque identique à celles de
str_count ( ) code>. Cela a du sens depuis
str_count () code> est essentiellement un wrapper pour
gregexpr () code>.
@ Josho'brien bon point. J'étais un peu surprise à quel point le GregeXPR code> é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 code>. Bon à savoir à ce sujet, alors merci d'avoir ajouté ces timings à votre message!
Dans un datable.table code> j-expression, vous pouvez faire
dt [ n = str_count (str, 'a')] code> pour obtenir le numéro de
'A ' code> dans
str code> pour chaque ligne, mais
dt [ n = longueur (gregexpr (' a ', str)] code> ne fonctionne pas et la solution de contournement (
Filtre Code> &
Unlist ecriste CODE>) prend une très longue période. Passer à
str_count code> dans mon
datable.table code> j-expression diminuait mon temps d'exécution de plusieurs heures à 30 minutes avec un grand jeu de données.
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:
Encore une fois parce que j'étais curieux, vous pouvez également nourrir un vecteur de correspondances à str_count code>.
str_count (str1, correspondances) code> retournera les mêmes 2 et 1.
Une autre option est une autre option stringi code>
référence h3>