432

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

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つのゼロを追加する必要がある場合はどうなりますか?

4

8 に答える 8

677

短いバージョン:useformatCまたはsprintf


長いバージョン:

先行ゼロの追加など、数値のフォーマットに使用できる関数がいくつかあります。どちらが最適かは、他にどのようなフォーマットを実行するかによって異なります。

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

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

paste(そしてそれは変形ですpaste0)あなたが出くわす最初の文字列操作関数であることがよくあります。これらは実際には数値を操作するようには設計されていませんが、そのために使用できます。常に単一のゼロを付加する必要がある単純なケースでpaste0は、が最善の解決策です。

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

数字に可変の桁数がある場合は、追加するゼロの数を手動で計算する必要があります。これは、病的な好奇心からのみ行う必要があるほど恐ろしいことです。


str_padfromstringrは、と同様に機能し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_padinはfromと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." 

goodsideの回答も参照してください。


完全を期すために、時々役立つ他のフォーマット関数について言及する価値がありますが、ゼロを付加する方法はありません。

format、数値のメソッドを使用して、あらゆる種類のオブジェクトをフォーマットするためのジェネリック関数。と少し似formatCていますが、さらに別のインターフェイスを備えています。

prettyNumはさらに別のフォーマット機能であり、主に手動軸目盛りラベルを作成するためのものです。これは、広範囲の数値に対して特にうまく機能します。

scalesパッケージにはpercent、などのいくつかの機能がdate_formatありdollar、特殊なフォーマットタイプ用です。

于 2011-04-28T09:56:01.920 に答える
237

桁数に関係なく機能する一般的なソリューションについてはdata$anim、関数を使用してsprintfください。それはこのように動作します:

sprintf("%04d", 1)
# [1] "0001"
sprintf("%04d", 104)
# [1] "0104"
sprintf("%010d", 104)
# [1] "0000000104"

あなたの場合、あなたはおそらく欲しいでしょう:data$anim <- sprintf("%06d", data$anim)

于 2011-04-28T01:29:03.617 に答える
38

@goodsideの回答を拡張する:

場合によっては、文字列をゼロで埋めたい場合があります(たとえば、fipsコードやその他の数値のような要素)。OSX / Linuxの場合:

> sprintf("%05s", "104")
[1] "00104"

ただし、ここsprintf()で説明するOSのCsprintf()コマンドを呼び出すため、Windows7では異なる結果が得られます。

> sprintf("%05s", "104")
[1] "  104"

したがって、Windowsマシンでは、回避策は次のとおりです。

> sprintf("%05d", as.numeric("104"))
[1] "00104"
于 2013-08-21T14:41:18.600 に答える
31

str_padパッケージからstringrは代替手段です。

anim = 25499:25504
str_pad(anim, width=6, pad="0")
于 2014-08-27T06:56:47.320 に答える
2

一般化可能なベースR関数は次のとおりです。

pad_left <- function(x, len = 1 + max(nchar(x)), char = '0'){

    unlist(lapply(x, function(x) {
        paste0(
            paste(rep(char, len - nchar(x)), collapse = ''),
            x
        )
    }))
}

pad_left(1:100)

私は好きですが、次のようなsprintf警告があります。

ただし、実際の実装はC99標準に従い、詳細(特にユーザーエラー時の動作)はプラットフォームによって異なる場合があります

于 2018-09-27T02:15:50.437 に答える
1

数字のように見えることがあり、Excelなどの多くのアプリケーションが先頭の0を破損して削除するか、科学的記数法に変換するCUSIPなどの文字列に先頭の0を追加する別の方法を次に示します。

@metasequoiaによって提供された回答を試したところ、返されたベクトルには先頭にスペースがあり、0sはありませんでした。これは@user1816679によって言及されたのと同じ問題であり、またはの前後の引用符を削除したり、からに0変更したりしても違いはありませんでした。参考までに、Ubuntuサーバーで実行されているRStudioサーバーを使用しています。この小さな2段階の解決策は私のために働きました:%d%s

gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))

%>%パッケージのpipe関数を使用すると、次のmagrittrようになります。

sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)

私は1つの機能のソリューションを好みますが、それは機能します。

于 2016-12-10T19:44:45.027 に答える
0
data$anim <- sapply(0, paste0,data$anim)
于 2016-04-20T18:40:31.793 に答える
0

数値文字列を一貫させたい他の状況のた​​めに、私は関数を作成しました。

誰かがこれが役に立つと思うかもしれません:

idnamer<-function(x,y){#Alphabetical designation and number of integers required
    id<-c(1:y)
    for (i in 1:length(id)){
         if(nchar(id[i])<2){
            id[i]<-paste("0",id[i],sep="")
         }
    }
    id<-paste(x,id,sep="")
    return(id)
}
idnamer("EF",28)

フォーマットについて申し訳ありません。

于 2017-04-03T01:27:46.613 に答える