先頭にゼロを追加するにはどうすればいいですか? 質問する

先頭にゼロを追加するにはどうすればいいですか? 質問する

次のようなデータセットがあります:

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

各動物の ID の前にゼロを追加したいと思います。

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

興味深いことに、動物 ID の前に 2 つまたは 3 つのゼロを追加する必要がある場合はどうなりますか?

ベストアンサー1

短いバージョン:使用formatCまたはsprintf


長いバージョン:

先頭のゼロの追加など、数値の書式設定に使用できる関数はいくつかあります。どれが最適かは、他にどのような書式設定を行うかによって異なります。

質問の例は、すべての値の桁数が最初から同じなので非常に簡単です。そこで、10 の累乗を幅 8 にする、より難しい例も試してみましょう。

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

paste(およびその変種paste0) は、多くの場合、最初に遭遇する文字列操作関数です。これらは実際には数値を操作するために設計されたものではありませんが、そのために使用できます。常に先頭に 1 つのゼロを追加する必要がある単純なケースでは、paste0が最適なソリューションです。

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

数字の桁数が可変の場合、先頭にゼロをいくつ追加するかを手動で計算する必要がありますが、これは非常に面倒なので、病的な好奇心からのみ行うべきです。


str_padstringrと同様に機能しpaste、何かをパディングしたいという意図をより明確に示します。

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

繰り返しますが、これは実際には数値で使用するために設計されていないため、難しいケースについては少し考える必要があります。単に「幅 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_padstringr


formatCC関数へのインターフェースである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." 

参照グッドサイドの回答


完全を期すために、時々役に立つが、先頭にゼロを追加する方法がない他の書式設定関数についても言及する価値があります。

formatは、数値用のメソッドを備えた、あらゆる種類のオブジェクトをフォーマットするための汎用関数です。 と少し似ていますformatCが、インターフェースが異なります。

prettyNumは、主に手動で軸の目盛りラベルを作成するための、もう 1 つの書式設定関数です。これは、数値の範囲が広い場合に特に適しています。

このscalesパッケージには次のような機能があります。percentdate_formatそしてdollar専門的なフォーマットタイプ向け。

おすすめ記事