2012-02-27 12 views
4

私はNAに変換したいと考えているNaNを含むいくつかの係数列を持つデータフレームを持っています(NaNは線形回帰オブジェクトを使用して予測する際に問題があるようです新しいデータ)。RはNaNをNAに変換できません

> tester1 <- c("2", "2", "3", "4", "2", "3", NaN) 
> tester1 
[1] "2" "2" "3" "4" "2" "3" "NaN" 
> tester1[is.nan(tester1)] = NA 
> tester1 
[1] "2" "2" "3" "4" "2" "3" "NaN" 
> tester1[is.nan(tester1)] = "NA" 
> tester1 
[1] "2" "2" "3" "4" "2" "3" "NaN" 
+0

あなたは見ているしたい場合がありますdata.tableパッケージからの 'setattr'も今日の私の質問でMatthewDowleの答えをチェックします:http://stackoverflow.com/questions/9463980/how-to-assign-within-apply-family –

+0

この例は意味をなさない:あなたはどのようにキャラクターを使用することを提案しますか?線形回帰のデータ –

+0

それは要因です。最後に、lm()が因子を扱うことができるかどうかチェックしました。私は例の周りに因子()を投げていたはずです。 – screechOwl

答えて

12

を問題です:あなたは、その後nan -nessのためにそれをテストする場合、文字列はFALSEを返し、もちろんそれは「数ではありません」ですので、あなたのベクトルは、モードの文字です。最後の要素は文字列 "NaN"として解釈されました。 is.nanを使用すると、ベクトルが数値である場合にのみ意味があります。文字ベクトルに値がないようにするには(回帰関数によって適切に処理されるように)、(引用符を付けずに)NA_character_を使用します。

> tester1 <- c("2", "2", "3", "4", "2", "3", NA_character_) 
> tester1 
[1] "2" "2" "3" "4" "2" "3" NA 
> is.na(tester1) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE 

「NA」も「NaN」も文字ベクタには実際にはありません。最後の結果は意外かもしれません

tester1[tester1 == "NaN"] = "NA" 
# but that would not really be a missing value either 
# and it might screw up a factor variable anyway. 

tester1[tester1=="NaN"] <- "NA" 
Warning message: 
In `[<-.factor`(`*tmp*`, tester1 == "NaN", value = "NA") : 
invalid factor level, NAs generated 
########## 
tester1 <- factor(c("2", "2", "3", "4", "2", "3", NaN)) 

> tester1[tester1 =="NaN"] <- NA_character_ 
> tester1 
[1] 2 2 3 4 2 3 <NA> 
Levels: 2 3 4 NaN 

:何らかの理由で、「NaNの」その後、あなただけの論理インデックスを使用できたであろうし、因子変数の値があった場合。残りの「NaN」レベルがありますが、要素のいずれも「NaN」ではありません。代わりに、 "NaN"だった要素がprintで示された本当の欠損値になりました。

4

EDIT:

ギャビン・シンプソンコメント欄にあなたの状況では、実際には「NA」と「NaNの」あるものに変換する方がはるかに簡単な方法がある、ということを思い出す:

tester1 <- gsub("NaN", "NA", tester1) 
tester1 
# [1] "2" "2" "3" "4" "2" "3" "NA" 

ソリューション:

文字ベクトルの要素がNaNあるかを検出するには、数値ベクトルにベクトルを変換する必要があります。

tester1[is.nan(as.numeric(tester1))] <- "NA" 
tester1 
[1] "2" "2" "3" "4" "2" "3" "NA" 

は説明:

これではないことの理由のカップルがあります。あなたが期待するように働いています。

最初に、NaNは "Not a Number"の略語ですが、クラス"numeric"を持ち、数値ベクトルの中でのみ意味を持ちます。

第2に、文字ベクトルに含まれている場合、NaNというシンボルは、暗黙的に文字列"NaN"に変換されます。ここで

class(NaN) 
# [1] "numeric" 
c("1", NaN) 
# [1] "1" "NaN" 
is.nan(c("1", NaN)) 
# [1] FALSE FALSE 
+0

???これは、文字列「NaN」を非常に丸い方法で「NA」に変換しています。確かにこれはOPの望むものではなく、彼らの例の中で「NA」を「NA」として使用しようとしたとしても同じです。 –

+0

@GavinSimpson - OK。今修正されました。肩の蛇口のおかげで、私の頭を引っ張ってきてくれてありがとう...雑草! –

+0

私はまだ、あなたがOPが望んでいることを思い知らされていないと思う。彼は 'NaN'を文字列バージョンではなくNAに変換したいが、実際のRバージョンはNot A NumberとMissingをそれぞれ示す。 OPの例の1つである "NA"を無視してください。つまり、赤いニシンです。NAを引用することは、文字ベクタやそのようなものではNAとして機能すると思っています。 –

5

あなたがここに持っているものである文字ベクトル、でNaNを持つことはできません:Rは、これは文字列であると考えてどのように

> tester1 <- c("2", "2", "3", "4", "2", "3", NaN) 
> is.nan(tester1) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
> tester1 
[1] "2" "2" "3" "4" "2" "3" "NaN" 

注意してください。あなたは数値ベクトルでNaNを作成することができます

> tester1 <- c("2", "2", "3", "4", "2", "3", NaN) 
> as.numeric(tester1) 
[1] 2 2 3 4 2 3 NaN 
> is.nan(as.numeric(tester1)) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE 

を次に、もちろん、RはあなたのコードごとにNANaNを変換することができます:

> foo <- as.numeric(tester1) 
> foo[is.nan(foo)] <- NA 
> foo 
[1] 2 2 3 4 2 3 NA 
関連する問題