引用addNA创建的因子级别

时间:2016-09-05 05:38:15

标签: r

如果我有一个具有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

2 个答案:

答案 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