どのようにして、情報を失わずに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
因子を数値に変換する良い方法はありますか?
559
3
?factor
]1の警告欄を参照してください。特に、
as.numeric
を factor に適用した場合は意味がありません。 特に、as.numeric
を因子に適用することは無意味であり、暗黙の強制によって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)` の値に対して行われます。 この速度差は,レベル数の少ない長いベクトルに対して最も顕著に現れます. 値がほとんどユニークであれば,速度に大きな差はありません。どのように変換しても,この操作がコードのボトルネックになることはないでしょうから,あまり気にしないでください。**タイミングについて
[2]: http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-do-I-convert-factors-to-numeric_003f
Rには、係数を変換するための(文書化されていない)便利な関数がいくつかあります。
as.character.factor
.as.data.frame.factor
(データフレーム)。as.Date.factor
(日付因子as.list.factor
(リスト因子)as.vector.factor
(ベクトル因子)しかし、困ったことに、factor -> numeric の変換を処理するものがありません。Joshua Ulrich'氏の回答の延長として、私は独自のイディオム的な関数を定義することでこの不備を克服することを提案します。
これは、ファクターのラベルが元の値と一致している場合にのみ可能です。例を挙げて説明します。
データがベクトル
x
だとします。