[解決済み] 情報を損なわずに因数を整数値に変換するには?
2022-03-15 23:38:05
質問
因子を数値や整数に変換すると、数値としてではなく、基になるレベルコードが表示されます。
f <- factor(sample(runif(5), 20, replace = TRUE))
## [1] 0.0248644019011408 0.0248644019011408 0.179684827337041
## [4] 0.0284090070053935 0.363644931698218 0.363644931698218
## [7] 0.179684827337041 0.249704354675487 0.249704354675487
## [10] 0.0248644019011408 0.249704354675487 0.0284090070053935
## [13] 0.179684827337041 0.0248644019011408 0.179684827337041
## [16] 0.363644931698218 0.249704354675487 0.363644931698218
## [19] 0.179684827337041 0.0284090070053935
## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218
as.numeric(f)
## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2
as.integer(f)
## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2
に頼らざるを得ない。
paste
を使用すると、実際の値を取得することができます。
as.numeric(paste(f))
## [1] 0.02486440 0.02486440 0.17968483 0.02840901 0.36364493 0.36364493
## [7] 0.17968483 0.24970435 0.24970435 0.02486440 0.24970435 0.02840901
## [13] 0.17968483 0.02486440 0.17968483 0.36364493 0.24970435 0.36364493
## [19] 0.17968483 0.02840901
因数を数値に変換する良い方法はありますか?
どのように解決するのですか?
の警告の項をご覧ください。
?factor
:
特に
as.numeric
に適用されます。 は無意味であり、また は暗黙の強制で発生する。 このため 因子を変換するf
を ほぼ元の数値 の値を指定します。as.numeric(levels(f))[f]
は を推奨し、若干 よりも効率的です。as.numeric(as.character(f))
.
Rに関するFAQ にも同様のアドバイスがあります。 .
なぜ
as.numeric(levels(f))[f]
よりも効率的です。
as.numeric(as.character(f))
?
as.numeric(as.character(f))
は、事実上
as.numeric(levels(f)[f])
で数値に変換しているわけです。
length(x)
値ではなく
nlevels(x)
の値です。 この速度差は、レベルの少ない長いベクトルで最も顕著に現れます。 値がほとんど一意であれば、速度に大きな差はありません。どのように変換しても、この操作がコードのボトルネックになることはないでしょうから、あまり気にする必要はないでしょう。
いくつかのタイミング
library(microbenchmark)
microbenchmark(
as.numeric(levels(f))[f],
as.numeric(levels(f)[f]),
as.numeric(as.character(f)),
paste0(x),
paste(x),
times = 1e5
)
## Unit: microseconds
## expr min lq mean median uq max neval
## as.numeric(levels(f))[f] 3.982 5.120 6.088624 5.405 5.974 1981.418 1e+05
## as.numeric(levels(f)[f]) 5.973 7.111 8.352032 7.396 8.250 4256.380 1e+05
## as.numeric(as.character(f)) 6.827 8.249 9.628264 8.534 9.671 1983.694 1e+05
## paste0(x) 7.964 9.387 11.026351 9.956 10.810 2911.257 1e+05
## paste(x) 7.965 9.387 11.127308 9.956 11.093 2419.458 1e+05
関連
-
Rでファイルを読み込む際に、そのようなファイルまたはディレクトリが見つかりません。
-
R: 環境と変数のスコープ問題
-
[解決済み] Rを再起動せずにパッケージをアンロードする方法
-
R plot.new() のエラー : 図形の余白が大きすぎる
-
[解決済み] 関数のソースコードを見るにはどうしたらいいですか?
-
[解決済み] require()とlibrary()の違いは何ですか?
-
[解決済み] 非常に大きなテーブルをデータフレームとして高速に読み込む
-
[解決済み] Rでtrycatchの書き方
-
[解決済み】data.table vs dplyr:一方がうまくできない、またはうまくできないことを行うことができますか?
-
[解決済み】ifelse()でDateオブジェクトがnumericオブジェクトにならないようにする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン