1. ホーム
  2. r

[解決済み] 先頭にゼロを付けるには?

2022-02-12 07:20:46

質問事項

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

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の前に0を追加してほしい。

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つのゼロを追加する必要がある場合はどうすればよいでしょうか。

どのように解決するのですか?

簡単に言うと 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_pad から stringr と同じように動作します。 paste ということをより明確にすることができます。

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

ここでも、数字を使うことを想定していないため、難しいケースは少し考える必要があります。 本来なら、quot;pad with zeroes to width 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" は整数を表し、quot;integer"は "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 は、専門的なフォーマットの種類を表します。