J'ai un data.frame dans lequel certaines variables contiennent une chaîne de texte. Je souhaite compter le nombre d'occurrences d'un caractère donné dans chaque chaîne individuelle.
Exemple:
q.data<-data.frame(number=1:3, string=c("greatgreat", "magic", "not"))
Je souhaite créer une nouvelle colonne pour q.data avec le nombre d'occurrences de "a" dans la chaîne (c.-à-d. C (2,1,0)).
La seule approche alambiquée que j'ai réussie est:
string.counter<-function(strings, pattern){
counts<-NULL
for(i in 1:length(strings)){
counts[i]<-length(attr(gregexpr(pattern,strings[i])[[1]], "match.length")[attr(gregexpr(pattern,strings[i])[[1]], "match.length")>0])
}
return(counts)
}
string.counter(strings=q.data$string, pattern="a")
number string number.of.a
1 1 greatgreat 2
2 2 magic 1
3 3 not 0
stringsAsFactors = FALSE
lors de la définition du bloc de données.stringsAsFactors=TRUE
sur ma composition, mais je n'ai pas mentionné celaSi vous ne voulez pas quitter la base R, voici une possibilité assez succincte et expressive:
la source
regmatches
etgregexpr
plusieurs fois ensemble, mais ce combo est suffisamment puissant pour que je pense qu'il méritait une prise.regmatches
est relativement nouveau. Il a été introduit en 2.14.Notez que je force la variable factor à caractère, avant de passer à nchar. Les fonctions regex semblent faire cela en interne.
Voici les résultats de référence (avec une taille du test augmentée à 3000 lignes)
la source
fixed=TRUE
àgsub
. Il y a aussi des cas oùfixed=TRUE
cela serait nécessaire (c'est-à-dire, lorsque le caractère que vous voulez compter pourrait être interprété comme une assertion regex telle que.
).est une bonne option.
la source
Le
stringi
package fournit les fonctionsstri_count
etstri_count_fixed
qui sont très rapides.référence
Comparé à l'approche la plus rapide de la réponse de @ 42- et à la fonction équivalente du
stringr
package pour un vecteur de 30 000 éléments.Les données
la source
Une variante de https://stackoverflow.com/a/12430764/589165 est
la source
Je suis sûr que quelqu'un peut faire mieux, mais cela fonctionne:
ou dans une fonction:
la source
Vous pouvez simplement utiliser la division de chaîne
Ce qui vous donnera 1, 3, 1, 0. Vous pouvez également utiliser la division de chaîne avec des expressions régulières et des mots entiers.
la source
Le moyen le plus simple et le plus propre à mon humble avis est:
la source
lengths(gregexpr('a', q.data$string))
revient2 1 1
, non2 1 0
.La question ci-dessous a été déplacée ici, mais il semble que cette page ne réponde pas directement à la question de Farah El. Comment trouver les numéros 1 dans 101 dans R
Alors, je vais écrire une réponse ici, juste au cas où.
https://stackoverflow.com/users/8931457/farah-el
la source
Une autre
base R
option pourrait être:la source
L'expression suivante fait le travail et fonctionne également pour les symboles, pas seulement les lettres.
L'expression fonctionne comme suit:
la source
Peut-être pas le plus efficace mais résoudre mon objectif.
la source