Existe-t-il une fonction pour compter le nombre de mots dans une chaîne? par exemple
str1 <- "How many words are in this sentence"
pour retourner un résultat de 7
Merci.
Existe-t-il une fonction pour compter le nombre de mots dans une chaîne? par exemple
str1 <- "How many words are in this sentence"
pour retourner un résultat de 7
Merci.
Utiliser l'expression régulière symbole \\W
de match non-caractères de mot, à l'aide de +
à indiquer un ou plus dans une rangée, avec gregexpr
trouver tous les matchs dans une chaîne de caractères. Les mots sont le nombre de séparateurs de mots de plus de 1.
sapply(gregexpr("\\W+", str1), length) + 1
Ceci ne fonctionnera pas avec des chaînes vides au début ou à la fin d'un caractère de vecteur, lors d'un "mot" n'est pas satisfaire \\W
s'notion de non-mot (on pourrait travailler avec d'autres expressions régulières, \\S+
, [[:alpha:]]
, etc., mais il y aura toujours des cas limites avec une regex approche), etc. Il est probablement plus efficace que l' strsplit
solutions, qui permettra d'allouer de la mémoire pour chaque mot. Les expressions régulières sont décrites en ?regex
.
Le moyen le plus simple serait:
require(stringr)
str_count("one, two three 4,,,, 5 6", "\\S+")
... en comptant toutes les séquences sur des caractères non-espace ( \\S+
).
Mais qu'en est-il d'une petite fonction qui nous permet également de décider quel type de mots nous aimerions compter et qui fonctionne également sur des vecteurs entiers ?
require(stringr)
nwords <- function(string, pseudo=F){
ifelse( pseudo,
pattern <- "\\S+",
pattern <- "[[:alpha:]]+"
)
str_count(string, pattern)
}
nwords("one, two three 4,,,, 5 6")
# 3
nwords("one, two three 4,,,, 5 6", pseudo=T)
# 6
str2 <- gsub(' {2,}',' ',str1)
length(strsplit(str2,' ')[[1]])
Le gsub(' {2,}',' ',str1)
s'assure que tous les mots sont séparés par un seul espace, en remplaçant toutes les occurrences de deux ou plusieurs espaces par un seul espace.
Le strsplit(str,' ')
divise la phrase à chaque espace et renvoie le résultat dans une liste. Le [[1]]
saisit le vecteur de mots de cette liste. Le length
compte le nombre de mots.
> str1 <- "How many words are in this sentence"
> str2 <- gsub(' {2,}',' ',str1)
> str2
[1] "How many words are in this sentence"
> strsplit(str2,' ')
[[1]]
[1] "How" "many" "words" "are" "in" "this" "sentence"
> strsplit(str2,' ')[[1]]
[1] "How" "many" "words" "are" "in" "this" "sentence"
> length(strsplit(str2,' ')[[1]])
[1] 7
Vous pouvez utiliser str_match_all
, avec une expression régulière qui identifierait vos mots. Ce qui suit fonctionne avec les espaces initiaux, finaux et dupliqués.
library(stringr)
s <- "
Day after day, day after day,
We stuck, nor breath nor motion;
"
m <- str_match_all( s, "\\S+" ) # Sequences of non-spaces
length(m[[1]])
La solution 7 ne donne pas le résultat correct dans le cas où il n'y a qu'un seul mot. Vous ne devez pas simplement compter les éléments dans le résultat de gregexpr (qui est -1 s'il n'y a pas de correspondance) mais compter les éléments> 0.
Ergo:
sapply(gregexpr("\\W+", str1), function(x) sum(x>0) ) + 1
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.