どのようにして、情報を失わずにFactorをIntelligent®numericに変換するのですか?

因子を数値や整数に変換すると、数値としての値ではなく、基礎となるレベルコードが得られます。

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

本当の値を得るためには、「貼り付け」に頼らなければなりません。

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]1の警告欄を参照してください。

特に、as.numeric を factor に適用した場合は意味がありません。 特に、as.numeric を因子に適用することは無意味であり、暗黙の強制によって

暗黙の強制で起こる可能性があります。 また 因子 f を次のように変換します。 元の数値に近い値に変換するには に変換するには、 as.numeric(levels(f))[f] が 推奨します。 よりも効率的です。 as.numeric(as.character(f))`よりも効率的です。

Rに関するFAQにも[同様のアドバイスがあります][2]。


**なぜas.numeric(levels(f))[f]as.numeric(as.character(f))よりも効率的なのですか?

as.numeric(as.character(f))は実質的にはas.numeric(levels(f)[f])であり、数値への変換はnlevels(x)の値ではなくlength(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

[2]: http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-do-I-convert-factors-to-numeric_003f

解説 (6)

Rには、係数を変換するための(文書化されていない)便利な関数がいくつかあります。

  • as.character.factor.
  • as.data.frame.factor (データフレーム)。
  • as.Date.factor (日付因子
  • as.list.factor (リスト因子)
  • as.vector.factor (ベクトル因子)
  • ...

しかし、困ったことに、factor -> numeric の変換を処理するものがありません。Joshua Ulrich'氏の回答の延長として、私は独自のイディオム的な関数を定義することでこの不備を克服することを提案します。


as.numeric.factor 
解説 (6)

これは、ファクターのラベルが元の値と一致している場合にのみ可能です。例を挙げて説明します。

データがベクトル x だとします。


x 
解説 (0)