これは、 への呼び出しの前に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 がそれを無視するレベルになるように因子のレベルを変更しています。それはまた、情報を取り除きます - ある意味では、それはもはや未知ではなく、「欠落」カテゴリーの一部です。NA
NA
NA
私たちのヘルプを見て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
はまだ因子に残っています。addNA
viaのほとんどの動作を複製できます。
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
追加を停止できます。NA
NA
間違っているのは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