11

NaNに変換したい を含むいくつかの因子列を持つデータフレームがありますNA(これは、NaN線形回帰オブジェクトを使用して新しいデータを予測する場合の問題のようです)。

> 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"
4

3 に答える 3

21

ここに問題があります:あなたのベクトルはモードの文字なので、もちろんそれは「数字ではありません」。その最後の要素は、文字列「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」も文字ベクトルに実際に欠落しているわけではありません。何らかの理由で「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」であった要素は、印刷で。として示される実際の欠落値になりました。

于 2012-02-27T22:17:50.917 に答える
8

NaNここにある文字ベクトルを使用することはできません。

> 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"

R がこれを文字列と見なすことに注意してください。

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 はコードに従って次のようNaNに変換できます。NA

> foo <- as.numeric(tester1)
> foo[is.nan(foo)] <- NA
> foo
[1]  2  2  3  4  2  3 NA
于 2012-02-27T22:21:36.283 に答える
7

編集:

コメントの Gavin Simpson は、あなたの状況では、実際には「NaN」を「NA」に変換するはるかに簡単な方法があることを思い出させてくれます。

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" の略ですが、 class"numeric"があり、数値ベクトル内でのみ意味があります。

第 2 に、シンボルが文字ベクトルに含まれている場合、シンボルNaNはサイレントに文字 string に変換されます"NaN"。次に、-ness をテストするとnan、文字列は次のように返されFALSEます。

class(NaN)
# [1] "numeric"
c("1", NaN)
# [1] "1"   "NaN"
is.nan(c("1", NaN))
# [1] FALSE FALSE
于 2012-02-27T22:12:25.713 に答える