如果我有一个具有NA
值的因子数组,则可以很方便
用额外的级别和addNA
替换了缺失的值
功能使这很容易。
x <- factor(c("a", "b", NA))
x
## [1] a b <NA>
## Levels: a b
is.na(x)
## [1] FALSE FALSE TRUE
x2 <- addNA(x)
x2
## [1] a b <NA>
## Levels: a b <NA>
但是如何引用这个级别呢?拨打is.na
或通常
我用来过滤的方法不起作用。
is.na(x2)
## [1] FALSE FALSE FALSE
x2 == 'NA'
## [1] FALSE FALSE FALSE
x2 == '<NA>'
## [1] FALSE FALSE FALSE
答案 0 :(得分:3)
我认为这与我能做到的一样干净利落:
x <- factor(c("a", "b", "b", NA, "a", NA))
x2 <- addNA(x)
x2
#[1] a b b <NA> a <NA>
#Levels: a b <NA>
is.na(levels(x2))[x2]
#[1] FALSE FALSE FALSE TRUE FALSE TRUE
答案 1 :(得分:2)
更新(2016-10-04):在询问此问题后不久,forcats包已发布。它包含函数fct_explicit_na
,可以轻松解决这个问题。
library(forcats)
x <- factor(c("a", "b", "b", NA, "a", NA))
x2 <- fct_explicit_na(x)
x2
## [1] a b b (Missing) a (Missing)
## Levels: a b (Missing)
x2 == '(Missing)'
## [1] FALSE FALSE FALSE TRUE FALSE TRUE
除了发布的回答,我发现使用droplevels
也有效。
x <- factor(c("a", "b", "b", NA, "a", NA))
x2 <- addNA(x)
x2
## [1] a b b <NA> a <NA>
## Levels: a b <NA>
is.na(droplevels(x2))
## [1] FALSE FALSE FALSE TRUE FALSE TRUE
另一个选项(根据this
answer)是替换
<NA>
等级与其他内容。
levels(x2)[is.na(levels(x2))] <- "isNA"
x2
## [1] a b b isNA a isNA
## Levels: a b isNA