2012-06-21 15 views
269

R'ye bölünmeden bir dizenin uzunluğunu (bir dizedeki karakter sayısı) nasıl bulunur? Bir listenin uzunluğunu nasıl bulacağımı biliyorum ama bir dizgeyi değil.R dizgesinin uzunluğu nasıl bulunur?

Peki ya Unicode dizeleri? Bir Unicode dizgesindeki uzunluğu (bayt cinsinden) ve karakter sayısını (runes, symbol) nasıl bulurum?

İlgili Soru:

+0

ile sorunları önler() boyunca 'un son öğesini döndürmek için anonim bir işlevle | vektör c (8, 4, 0). Anonim fonksiyonunuz sadece bir argüman almalı, | bir değişken x olmak. – uxi

cevap

316

?nchar bakınız. Örneğin:

> nchar("foo") 
[1] 3 
> set.seed(10) 
> strn <- paste(sample(LETTERS, 10), collapse = "") 
> strn 
[1] "NHKPBEFTLY" 
> nchar(strn) 
[1] 10 
+44

Dikkat edin nchar (NA) ' – hadley

+0

@hadley Gerçekten de, ya da bir ya da daha fazla' NA's içeren herhangi bir karakter vektörü. (Bu şekilde belgelenmiş olsa da). –

+6

Veya "stringi" den 'stri_length' kullanın - NA'larla iyi çalışır ve daha hızlıdır :) Mesajımı kontrol edin! – bartektartanus

19

Ayrıca stringr paketini kullanabilirsiniz:

library(stringr) 
str_length("foo") 
[1] 3 
3
nchar(YOURSTRING) 
önce bir karakter vektöre dönüştürmek gerekebilir

;

nchar(as.character(YOURSTRING)) 
+1

Bir faktör girdisi dışında, zorlama "nchar" ile gerçekleştirilir. Faktör girdileri için, 'nchar' bir hatayı atar ve bu nedenle gösterimi yaptığınız gibi önce dönüştürme işlemini yapmanız gerekir. –

53

Kullanım stringi paketi ve stri_length fonksiyon

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

Neden? sunuluş çözümleri :)

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 

arasında HIZLI ve aynı zamanda NA'nın

nchar(NA) 
## [1] 2 
stri_length(NA) 
## [1] NA 
+1

Cevabınız ve büyük kütüphane için teşekkür ederim (eğer doğru anladıysam kütüphanenizdir). Unicode dizeleri ne olacak? –

+0

Ayrıca iyi çalışıyor. Şu örneğe bakın: 'stri_length ('\ u0105')' uzunluk bir, ancak ... 'stri_numbytes ('\ u0105')' 2 bayt kullanılır – bartektartanus

5

keepNA = DOĞRU seçeneğiyle çalışıyor Çünkü NA değerlendirmek kullanarak

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

3.3.1'deki temel varsayılanlar nchar (NA) ## [1] NA' vermek için ayarlanır: bkz. [Nchar RDocumentation] (https://www.rdocumentation.org/packages/base/versions/3.3.1/topics/nchar) –