web-dev-qa-db-ja.com

値を変更せずにRで因子形式を数値形式に変換するにはどうすればよいですか?

以下は、現在の値(0; 0; 8,5; 3)を変更せずに、列「V2」を因子形式から数値に変換したいデータフレームdf1です。

df1 =

_             V1  V2 V3       X2 X3
4470 2010-03-28   0  A 21.53675  0
4471 2010-03-29   0  A 19.21611  0
4472 2010-03-30 8,5  A 21.54541  0
4473 2010-03-31   3  A       NA NA
_

列「V2」はファクター形式なので、最初に文字形式に変換します:df1[,2]=as.character(df1[,2])

次に、「V2」を数値形式に変換しようとします。

df1[,2]=as.numeric(df1[,2])

このRメッセージにつながる:

_Warning message: NAs introduced by coercion_

そして、_df[3,2]_が「8,5」のままではなく「NA」に変更された以下のデータフレーム。

_             V1 V2 V3       X2 X3
4470 2010-03-28  0  A 21.53675  0
4471 2010-03-29  0  A 19.21611  0
4472 2010-03-30 NA  A 21.54541  0
4473 2010-03-31  3  A       NA NA 
_

それは8,5が整数ではないという事実と関係があるかもしれません。それでも私はこの問題を解決する方法がわかりません。助けていただければ幸いです!

4
MB123

コンマをドットに置き換えます。ドットはRの小数を表します。それ以外の場合、Rはそれが文字であると見なし、値をNAに強制します。

次に、値を抽出するには:

as.numeric(levels(df1[,2])[df[,2]])

(訂正してくれた@ SimonO101に感謝します)

7
Maxim.K

これを試して、データのコンマを置き換えてください。

fac<- c( "0" , "0" , "1,5" , "0" , "0" , "8" )
#[1] "0"   "0"   "1,5" "0"   "0"   "8" 
fac <- as.numeric( sub(",", ".", fac) )
#[1] 0.0 0.0 1.5 0.0 0.0 8.0

より一般的には、因子表現ではなく、因子をその基礎となる値に変換します。

fac <- as.factor( fac )
as.numeric(fac)
#[1] 1 1 2 1 1 3
as.numeric(as.character(fac))
#[1] 0.0 0.0 1.5 0.0 0.0 8.0

ただし、これは元の値に変換する標準的な方法です

 as.numeric(levels(fac))[fac]

ヘルプページから?as.factor

特に、因子に適用されるas.numericは無意味であり、暗黙の強制によって発生する可能性があります。係数fをほぼ元の数値に変換するには、as.numeric(levels(f))[f]をお勧めします。これは、as.numeric(as.character(f))よりもわずかに効率的です。

9
Simon O'Hanlon

文字に変換した後、次のコード行を追加します。

df[3,2] <- 8.5

これで、文字を数値に変換できるようになります。 Rのデフォルトの小数点記号は.ではなく,であるため、そのステップなしで値はNAに置き換えられます。

0
fdetsch