Как найти длину строки в R

348

Как найти длину строки (количество символов в строке), не разбивая ее на R? Я знаю, как найти длину списка, но не строки.

А как насчет строк Unicode? Как найти длину (в байтах) и количество символов (руны, символы) в строке Unicode?

Связанный вопрос:

Игорь Чубин
источник
1
с помощью метода define () и анонимной функции для возврата последнего элемента | вектор с (8, 4, 0). Ваша анонимная функция должна принимать только один аргумент, который должен | быть переменной x.
Уси

Ответы:

417

См ?nchar. Например:

> nchar("foo")
[1] 3
> set.seed(10)
> strn <- paste(sample(LETTERS, 10), collapse = "")
> strn
[1] "NHKPBEFTLY"
> nchar(strn)
[1] 10
Гэвин Симпсон
источник
55
Остерегайтесьnchar(NA)
Хэдли
@hadley Действительно, или в этом отношении любой символьный вектор с одним или несколькими символами NAs. (Хотя это задокументировано так).
Гэвин Симпсон
7
Или используйте stri_lengthfrom stringi- он отлично работает с NA и работает быстрее :) Проверьте мой пост!
bartektartanus
6
По состоянию на 3.3.1 базовые значения по умолчанию установлены так nchar(NA) ## [1] NA: см. Nchar RDocumentation
leerssej
3
@IgorChubin, вы должны задать это как новый вопрос, а не редактировать почти двухлетний.
Гэвин Симпсон
66

Используйте stringiпакет и stri_lengthфункцию

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

Зачем? Потому что это самый быстрый из представленных решений :)

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

а также отлично работает с NA

nchar(NA)
## [1] 2
stri_length(NA)
## [1] NA
bartektartanus
источник
1
Спасибо за ответ и за отличную библиотеку (это ваша библиотека, если я правильно понял). А как насчет строк Unicode?
Игорь Чубин
1
Тоже работает нормально. Посмотрите на этот пример: stri_length('\u0105') длина равна одному, но ... используются stri_numbytes('\u0105') 2 байта
bartektartanus
Это должно быть обновлено , поскольку в nchar()настоящее время имеет аргумент счет для NA - х:allowNA = FALSE
Riley Finn
26

Вы также можете использовать stringrпакет:

library(stringr)
str_length("foo")
[1] 3
Johannes
источник
8

Опция keepNA = TRUE предотвращает проблемы с NA

nchar(NA)
## [1] 2
nchar(NA, keepNA=TRUE)
## [1] NA
Томас Буль
источник
1
По состоянию на 3.3.1 базовые значения по умолчанию установлены так nchar(NA) ## [1] NA: см. Nchar RDocumentation
leerssej
6
nchar(YOURSTRING)

вам может понадобиться сначала преобразовать в символьный вектор;

nchar(as.character(YOURSTRING))
Джонатан
источник
1
За исключением факторного ввода, принуждение выполняется nchar. Для факторных входов ncharвыдает ошибку и, следовательно, сначала вам нужно будет выполнить преобразование, как показано.
Гэвин Симпсон