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:


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

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

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


8

Opcja keepNA = TRUE zapobiega problemom z NA

nchar(NA)
## [1] 2
nchar(NA, keepNA=TRUE)
## [1] NA

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))

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.