web-dev-qa-db-ja.com

<NA>とNAの違いは何ですか?

レベルが「Y」と「N」のSMOKEという名前の因子があります。欠損値はNAで置き換えられました(初期レベル「NULL」から)。しかし、私が要因を見るとき、私はこのようなものを得ます:

head(SMOKE)
N N <NA> Y Y N
Levels: Y N

RがNA<NA>として表示するのはなぜですか?そして、違いはありますか?

42
oort

factorsを扱っている場合、NAが山括弧(<NA>)で囲まれていると、それが実際にはNAであることを示します。

かっこなしでNAの場合はnot NAですが、ラベルが"NA"の適切な要素です

# Note a 'real' NA and a string with the Word "NA"
x <- factor(c("hello", NA, "world", "NA"))

x
[1] hello <NA>  world NA   
Levels: hello NA world      <~~ The string appears as a level, the actual NA does not. 

as.numeric(x)              
[1]  1 NA  3  2            <~~ The string has a numeric value (here, 2, alphabetically)
                               The NA's numeric value is just NA

@Arunの質問に回答するように編集します。

Rは、値が2つの文字"NA"である文字列と実際の欠損値NAを区別しようとするだけです。したがって、dfを表示すると、違いがわかります対df$y。例:

df <- data.frame(x=1:4, y=c("a", NA_character_, "c", "NA"), stringsAsFactors=FALSE)

NAの2つの異なるスタイルに注意してください。

> df
  x    y
1 1    a
2 2 <NA>
3 3    c
4 4   NA

ただし、「df $ y」だけを見ると

[1] "a"  NA   "c"  "NA"

しかし、引用符を削除すると(コンソールにdata.frameを印刷したときに表示されるのと同様)、次のようになります。

print(df$y, quote=FALSE)
[1] a    <NA> c    NA  

したがって、山かっこでNAを区別します。

46
Ricardo Saporta

これは、RがNAを係数で表示する方法です。

> as.factor(NA)
[1] <NA>
Levels: 
> 
> f <- factor(c(1:3, NA))
> levels(f)
[1] "1" "2" "3"
> f
[1] 1    2    3    <NA>
Levels: 1 2 3
> is.na(f)
[1] FALSE FALSE FALSE  TRUE

これは、文字ラベル/レベルの場合でも、引用符なしで因子が出力されるときに因子が出力される方法でNA"NA"を区別する手段であると推測します。

> f2 <- factor(c("NA",NA))
> f2
[1] NA   <NA>
Levels: NA
> is.na(f2)
[1] FALSE  TRUE