1

データフレームがあり、数値変数を 4 桁の長さにしたいのですが、これを行うには、1 ~ 3 個の先行ゼロを追加する必要があります。これを行うために選択した方法は sprintf 関数です。文字クラスに変換されます。残念ながら、結果は私が望む順序で出ていません

テスト データ フレームは次のように作成され、簡単に比較できるように先頭の 0 列が 3 番目の列として追加されます。コードを実行するとわかるように、先頭のゼロの数字が貼り付けられる順序は、元の番号の順序と一致しません。

test <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test[,3]<-sprintf("%04d", test[,2])

元の数値列を文字として分類してデータ フレームの順序をアルファベット順に並べ替えると、数値系列はそうではありませんが、sprintf 数値は昇順になりました。

test.two <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test.two <- test.two[i <-order(as.character(test.two[,2])),]
test.two[,3]<-sprintf("%04d", test.two[,2])

一緒にフランケンシュタイン化することで、目的のデータ セットを作成できます。

test.three <- as.data.frame(cbind(letters,seq(from=1, to=26)))
test.three[,3]<-test.two[,3]

しかし、私が間違っていることと、単純な操作だと思っていたものから期待される結果が得られる方法を知りたいです!

4

1 に答える 1

4

これは、2 番目の列が因子であるためです。

test <- as.data.frame(cbind(letters,seq(from=1, to=26)))
sapply(test, class)
##  letters       V2 
## "factor" "factor" 
test[,3]<-sprintf("%04d", test[,2])

as.numeric(test$V2)
##  [1]  1 12 20 21 22 23 24 25 26  2  3  4  5  6  7  8  9 10 11 13 14 15 16 17 18
## [26] 19

test$V2 <- as.integer(as.character(test$V2))
test[,4]<-sprintf("%04d", test[,2])

##   letters V2   V3   V4
## 1       a  1 0001 0001
## 2       b  2 0012 0002
## 3       c  3 0020 0003
## 4       d  4 0021 0004
## 5       e  5 0022 0005
## 6       f  6 0023 0006
于 2014-02-27T11:38:20.710 に答える