SORU
28 NİSAN 2011, PERŞEMBE


ekleme sıfırları kullanarak R

Bu gibi bir şey görünüyor, bir veri kümesi var:

anim <- c(25499,25500,25501,25502,25503,25504)
sex  <- c(1,2,2,1,2,1)
wt   <- c(0.8,1.2,1.0,2.0,1.8,1.4)
data <- data.frame(anim,sex,wt)

data
   anim sex  wt anim2
1 25499   1 0.8     2
2 25500   2 1.2     2
3 25501   2 1.0     2
4 25502   1 2.0     2
5 25503   2 1.8     2
6 25504   1 1.4     2

Sıfır her hayvanın kimliği önce eklenecek istiyorum:

data
   anim sex  wt anim2
1 025499   1 0.8     2
2 025500   2 1.2     2
3 025501   2 1.0     2
4 025502   1 2.0     2
5 025503   2 1.8     2
6 025504   1 1.4     2

Ve çıkar uğruna, eğer hayvan kimliği olmadan 2 veya 3 sıfır eklemek istersem ne olur?

CEVAP
28 NİSAN 2011, PERŞEMBE


Kısa versiyonu: formatC veya sprintf.


Uzun versiyonu:

Çeşitli fonksiyonları numaraları, önde gelen sıfır eklemek gibi biçimlendirme vardır. İyi olan ne diğer biçimlendirmeleri yapmak istediğine bağlıdır.

Soru örneği tüm değerleri aynı sayıda basamak ile başlamak zorunda, hadi 10, genişlik 8 de yetkileri yapmaktan daha zor bir örnek deneyin bu yana oldukça kolaydır.

anim <- 25499:25504
x <- 10 ^ (0:5)

paste(ve varyant paste0) genellikle ilk dize manipülasyon rastlamak. işlevleri Gerçekten manipüle numaraları için tasarlanmış değil, ama bunun için kullanılabilir. Biz her zaman tek bir sıfır, paste0 önüne basit bir durumda en iyi çözüm.

paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"

Davayı nerede orada bir değişken basamak sayısı sayıları, elle hesaplamak kaç sıfır önüne, bu korkunç, bu kadar yeter sana gereken sadece bunun dışında hastalıklı bir merak işte.


str_padstringr benzer şekilde 21**, pad şeyler istiyorsun daha açık yapmaya çalışıyor.

library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"

Yine, gerçekten zor bir durum biraz düşünmeyi gerektirir bu yüzden numaraları ile kullanım için tasarlanmış değil. Sadece söylemek yapabilmeliyiz sıfır 8 genişliği ile "pad" ama bak bu çıktı:

str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e 05"

Bilimsel cezası sayılar her zaman biçimlendirilmiş olan option ayarlamak için sabit gösterim (bilimsel gösterim yerine) kullanarak ihtiyacın var.

library(devtools)
with_options(c(scipen = 999), str_pad(x, 8, pad = "0"))
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

stri_padstringi çalışır str_pad gibi stringr.


formatCC arabirim işlevi printf. Bunu kullanarak temel işlevi arcana bilgisine (bağlantıya bakınız) gerektirir. Bu durumda, önemli noktaları width tartışma format "tamsayı" ve"0" flag bir ön yerleştirmeyi sıfır. "d" ediliyor

formatC(anim, width = 6, format = "d", flag = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
formatC(x, width = 8, format = "d", flag = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

Bu tinker kolay genişliğini değiştirme de en sevdiğim çözümdür, ve işlevi diğer biçimlendirme değişiklikleri yapmak için yeterince güçlü.


sprintfaynı adı taşıyan C için bir arabirim işlevi; farklı bir sözdizimi ile formatC gibi ama.

sprintf("d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"

sprintf avantajı metin uzun bit içinde biçimlendirilmiş sayılar gömebilirsiniz.

sprintf(
  "Animal ID d was a %s.", 
  anim, 
  sample(c("lion", "tiger"), length(anim), replace = TRUE)
)
## [1] "Animal ID 025499 was a tiger." "Animal ID 025500 was a tiger."
## [3] "Animal ID 025501 was a lion."  "Animal ID 025502 was a tiger."
## [5] "Animal ID 025503 was a tiger." "Animal ID 025504 was a lion." 

Ayrıca goodside's answer bkz.


Bütünlüğü için zaman zaman yararlı olan diğer biçimlendirme işlevleri belirtmekte yarar var, ama ön yerleştirmeyi sıfır bir yöntem var.

formatsayılar için bir yöntem ile , genel bir işlev nesnesi herhangi bir biçimlendirme için. Başka bir arayüz ile formatC gibi ama biraz işe yarıyor.

prettyNumbaşka bir biçimlendirme işlevi, çoğunlukla manuel eksen onay etiketleri oluşturmak için. Özellikle de sayıları geniş aralıklar için çalışıyor.

scalespaketi uzmanı biçim türleri için percent, date_format dollar gibi birçok işlevi vardır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • grickle

    grickle

    22 AĞUSTOS 2006
  • metallmanutza13

    metallmanutz

    13 NİSAN 2007
  • PhoneBuff

    PhoneBuff

    10 HAZİRAN 2011