これは、 への呼び出しの前にaddNA()OP のデータで行われることに注意してください。
addNA()このデータで何が行われるかを確認することは有益です。
> head(df1$var1)
[1] <NA> def  ghi  jkl  <NA> def 
Levels: abc def ghi jkl
> levels(df1$var1)
[1] "abc" "def" "ghi" "jkl"
> head(addNA(df1$var1))
[1] <NA> def  ghi  jkl  <NA> def 
Levels: abc def ghi jkl <NA>
> levels(addNA(df1$var1))
[1] "abc" "def" "ghi" "jkl" NA
addNA欠落度 ( ) がデフォルトで R がそれを無視するレベルになるように因子のレベルを変更しています。それはまた、情報を取り除きます - ある意味では、それはもはや未知ではなく、「欠落」カテゴリーの一部です。NANANA
私たちのヘルプを見てaddNAください?addNA。
の定義addNAを見ると、それがしているのはレベルの変更だけであることがわかります
of the factor, not changing the data any:
> addNA
function (x, ifany = FALSE) 
{
    if (!is.factor(x)) 
        x <- factor(x)
    if (ifany & !any(is.na(x))) 
        return(x)
    ll <- levels(x)
    if (!any(is.na(ll))) 
        ll <- c(ll, NA)
    factor(x, levels = ll, exclude = NULL)
}
それ以外の場合、データは変更されないことに注意してください - それらNAはまだ因子に残っています。addNAviaのほとんどの動作を複製できます。
with(df1, factor(var1, levels = c(levels(var1), NA), exclude = NULL))
> head(with(df1, factor(var1, levels = c(levels(var1), NA), exclude = NULL)))
[1] <NA> def  ghi  jkl  <NA> def 
Levels: abc def ghi jkl <NA>
ただし、NAがレベルになったため、これらのエントリは欠落しているとは示されis.na()ませんis.na()。
あなたが得られる唯一の利点は、それがすでに1つとして存在している場合、それがレベルとしてaddNA追加されないことです. NAまた、データに sがない場合は、 を介してレベルとしてのifany追加を停止できます。NANA
間違っているのはNA、通常の比較方法を使用して何かと比較しようとすることです(2番目の例を除く)。どのような価値と観察が必要なのかわからない場合NA、どのようにそれを何かと比較できますか? の内部表現以外ではできませんNA。これはis.na()関数によって行われることです:
> with(df1, head(is.na(var1), 10))
 [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE
したがって、私はそうします(addNA まったく使用せずに)
df1 <- transform(df1, isNaCol = is.na(var1))
> head(df1)
  id y var1 var2 var3 isNaCol
1  1 1 <NA> ab c  abc    TRUE
2  2 0  def  ghi  ghi   FALSE
3  3 0  ghi  jkl  nop   FALSE
4  4 0  jkl  def  xyz   FALSE
5  5 0 <NA> ab c  abc    TRUE
6  6 1  def  ghi  ghi   FALSE
1それを, , 変数にしたい場合は、次0のように追加するだけas.numeric()です
df1 <- transform(df1, isNaCol = as.numeric(is.na(var1)))
あなたが本当に間違っていると思うのはNA、要因にレベルを付けたいということです。のようaddNA()なもので使用するための便利な関数と見なしtable()ますが、それには の事前の使用を必要としない引数がありますaddNA()。
> with(df1, table(var1, useNA = "ifany"))
var1
 abc  def  ghi  jkl <NA> 
   0   50   50   50   50