短いバージョン:formatC
またはを使用しますsprintf
。
長いバージョン:
先行ゼロの追加など、数値のフォーマットに使用できるいくつかの関数があります。どちらが最適かは、実行する他のフォーマットによって異なります。
質問の例は、すべての値が最初は同じ桁数であるため、非常に簡単です。10の累乗を8の累乗にするより難しい例を試してみましょう。
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(そしてそのバリアントですpaste0
)は、多くの場合、最初に遭遇する最初の文字列操作関数です。これらは実際には数値を操作するようには設計されていませんが、そのために使用できます。常に単一のゼロを付加する必要がある単純なケースでpaste0
は、これが最良のソリューションです。
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
数字の桁数が可変である場合、先頭に追加するゼロの数を手動で計算する必要があります。これは、病的な好奇心からそれを実行するだけで十分なほど恐ろしいことです。
str_pad
from stringr
はと同様に機能しpaste
、パディングしたいことをより明確にします。
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
繰り返しになりますが、これは実際に数値で使用するように設計されていないため、より難しいケースについては少し考える必要があります。「0から幅8までのパッド」と言うことができるはずですが、次の出力を見てください。
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
数値が常に(科学表記ではなく)固定表記を使用してフォーマットされるように、科学ペナルティオプションを設定する必要があります。
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
のstringi
作品とまったく同じstr_pad
ですstringr
。
formatC
C関数へのインターフェースprintf
です。それを使用するには、その基礎となる関数のアルカナの知識が必要です(リンクを参照)。この場合、重要な点はwidth
引数でformat
あり"d"
、「整数」であり、"0"
flag
ゼロを前に付けることです。
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"
これは私のお気に入りのソリューションです。幅を変更することで簡単に変更でき、関数は他の書式変更を行うのに十分強力です。
sprintf
同じ名前のC関数へのインターフェースです。のようですformatC
が、構文が異なります。
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
の主な利点はsprintf
、フォーマットされた数値を長いテキスト内に埋め込めることです。
sprintf(
"Animal ID %06d 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."
goodsideの回答も参照してください。
完全を期すために、時々役立つ他のフォーマット関数に言及する価値がありますが、ゼロを付加する方法はありません。
format
、数値のメソッドを使用して、あらゆる種類のオブジェクトをフォーマットするための汎用関数。はのようformatC
に機能しますが、さらに別のインターフェースを備えています。
prettyNum
は、主に手動の軸目盛りラベルを作成するための、さらに別のフォーマット関数です。これは、広範囲の数値に対して特に効果的です。
scales
パッケージには、次のようないくつかの機能があるpercent
、date_format
とdollar
専門家のフォーマットタイプのために。
data$anim = paste(rep(0, n), data$anim, sep = "")