Comment trouver la longueur d'une chaîne en R

348

Comment trouver la longueur d'une chaîne (nombre de caractères dans une chaîne) sans la diviser en R? Je sais trouver la longueur d'une liste mais pas d'une chaîne.

Et qu'en est-il des chaînes Unicode? Comment trouver la longueur (en octets) et le nombre de caractères (runes, symboles) dans une chaîne Unicode?

Question connexe:

Igor Chubin
la source
1
en utilisant assess () avec une fonction anonyme pour retourner le dernier élément de | le vecteur c (8, 4, 0). Votre fonction anonyme ne doit prendre qu'un seul argument qui doit | être une variable x.
uxi

Réponses:

417

Tu vois ?nchar. Par exemple:

> nchar("foo")
[1] 3
> set.seed(10)
> strn <- paste(sample(LETTERS, 10), collapse = "")
> strn
[1] "NHKPBEFTLY"
> nchar(strn)
[1] 10
Gavin Simpson
la source
55
Attentionnchar(NA)
hadley
@hadley En effet, ou d'ailleurs n'importe quel vecteur de caractère avec un ou plusieurs NAs. (Bien que cela soit documenté).
Gavin Simpson
7
Ou utilisez à stri_lengthpartir de stringi- cela fonctionne bien avec les NA et c'est plus rapide :) Vérifiez mon message!
bartektartanus
6
Depuis 3.3.1, les valeurs par défaut de base sont définies pour donner nchar(NA) ## [1] NA: voir nchar RDocumentation
leerssej
3
@IgorChubin, vous devriez poser cette question comme une nouvelle question, et non en modifier une vieille de presque 2 ans.
Gavin Simpson,
66

Utiliser le stringipackage et la stri_lengthfonction

> stri_length(c("ala ma kota","ABC",NA))
[1] 11  3 NA

Pourquoi? Parce que c'est la PLUS RAPIDE parmi les solutions présentées :)

require(microbenchmark)
require(stringi)
require(stringr)
x <- c(letters,NA,paste(sample(letters,2000,TRUE),collapse=" "))
microbenchmark(nchar(x),str_length(x),stri_length(x))
Unit: microseconds
           expr    min     lq  median      uq     max neval
       nchar(x) 11.868 12.776 13.1590 13.6475  41.815   100
  str_length(x) 30.715 33.159 33.6825 34.1360 173.400   100
 stri_length(x)  2.653  3.281  4.0495  4.5380  19.966   100

et fonctionne aussi très bien avec les NA

nchar(NA)
## [1] 2
stri_length(NA)
## [1] NA
bartektartanus
la source
1
Merci pour la réponse et pour la grande bibliothèque (c'est votre bibliothèque si j'ai bien compris). Qu'en est-il des chaînes Unicode?
Igor Chubin
1
Fonctionne bien aussi. Regardez cet exemple: la stri_length('\u0105') longueur est un, mais ... stri_numbytes('\u0105') 2 octets sont utilisés
bartektartanus
Cela devrait être mis à jour car nchar()il y a maintenant un argument qui explique les NA:allowNA = FALSE
Riley Finn
26

Vous pouvez également utiliser le stringrpackage:

library(stringr)
str_length("foo")
[1] 3
johannes
la source
25
nchar("STRING")

Découvrez ceci

sangloter
la source
8

L'option keepNA = TRUE empêche les problèmes avec NA

nchar(NA)
## [1] 2
nchar(NA, keepNA=TRUE)
## [1] NA
Thomas Buhl
la source
1
Depuis 3.3.1, les valeurs par défaut de base sont définies pour donner nchar(NA) ## [1] NA: voir nchar RDocumentation
leerssej
6
nchar(YOURSTRING)

vous devrez peut-être d'abord convertir en un vecteur de caractères;

nchar(as.character(YOURSTRING))
Jonathan
la source
1
À l'exception d'une entrée de facteur, la coercition est effectuée par nchar. Pour les entrées de facteur,nchar générera une erreur et vous devrez donc effectuer la conversion en premier comme vous le montrez.
Gavin Simpson