Jak znaleźć długość ciągu w R

348

Jak znaleźć długość ciągu (liczbę znaków w ciągu) bez dzielenia go na R? Wiem, jak znaleźć długość listy, ale nie łańcucha.

A co z ciągami znaków Unicode? Jak znaleźć długość (w bajtach) i liczbę znaków (runy, symbole) w ciągu znaków Unicode?

Powiązane pytanie:

Igor Chubin
źródło
1
za pomocą oceny () wraz z anonimową funkcją, aby zwrócić ostatni element | wektor c (8, 4, 0). Twoja anonimowa funkcja powinna wziąć tylko jeden argument, który powinien | być zmienną x.
uxi

Odpowiedzi:

417

Zobaczyć ?nchar. Na przykład:

> nchar("foo")
[1] 3
> set.seed(10)
> strn <- paste(sample(LETTERS, 10), collapse = "")
> strn
[1] "NHKPBEFTLY"
> nchar(strn)
[1] 10
Gavin Simpson
źródło
55
Uwaganchar(NA)
hadley,
@ Hadley Rzeczywiście, lub w tym przypadku dowolny wektor znaków z jednym lub więcej NAs. (Chociaż jest to udokumentowane).
Gavin Simpson
7
Lub użyj stri_lengthz stringi- działa dobrze z NA i jest szybszy :) Sprawdź mój post!
bartektartanus
6
Począwszy od 3.3.1, podstawowe ustawienia domyślne są ustawione na dawanie nchar(NA) ## [1] NA: patrz nchar RD Dokumentacja
leerssej
3
@IgorChubin powinieneś zadać to pytanie jako nowe, a nie edytować prawie 2-letnie.
Gavin Simpson
66

Użyj stringipakietu i stri_lengthfunkcji

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

Dlaczego? Ponieważ jest to NAJSZYBSZY spośród prezentowanych rozwiązań :)

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

a także działa dobrze z NA

nchar(NA)
## [1] 2
stri_length(NA)
## [1] NA
bartektartanus
źródło
1
Dziękuję za odpowiedź i świetną bibliotekę (to twoja biblioteka, jeśli dobrze ją zrozumiałem). Co z ciągami znaków Unicode?
Igor Chubin
1
Działa też dobrze. Spójrz na ten przykład: stri_length('\u0105') długość wynosi jeden, ale ... stri_numbytes('\u0105') używane są 2 bajty
bartektartanus
Powinno to zostać zaktualizowane, ponieważ nchar()teraz ma argumenty dotyczące NA:allowNA = FALSE
Riley Finn
26

Możesz również użyć stringrpakietu:

library(stringr)
str_length("foo")
[1] 3
Johnnes
źródło
25
nchar("STRING")

Sprawdź to

sobingt
źródło
8

Opcja keepNA = TRUE zapobiega problemom z NA

nchar(NA)
## [1] 2
nchar(NA, keepNA=TRUE)
## [1] NA
Thomas Buhl
źródło
1
Począwszy od 3.3.1, podstawowe ustawienia domyślne są ustawione na dawanie nchar(NA) ## [1] NA: patrz nchar RD Dokumentacja
leerssej
6
nchar(YOURSTRING)

być może będziesz musiał najpierw przekonwertować na wektor znaków;

nchar(as.character(YOURSTRING))
Jonathan
źródło
1
Z wyjątkiem wprowadzenia czynnika, przymus jest wykonywany przez nchar. W przypadku czynników wejściowych ncharwyrzuci błąd i dlatego najpierw musisz wykonać konwersję, jak pokazano.
Gavin Simpson