请注意,这是在调用addNA()
.
看看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
正在改变因子的水平,使得缺失 ( NA
) 是默认情况下 R 忽略它的水平,因为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()
。
您从中获得的唯一好处addNA
是,如果它已经作为一个级别存在,它就不会添加NA
为一个级别。此外,如果数据中没有s,ifany
您可以通过 停止将其添加为级别。NA
NA
您出错的地方是尝试NA
使用通常的比较方法将 a 与某物进行比较(第二个示例除外)。如果我们不知道什么价值和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