访问和过滤由 parse_factor() 创建的显式 NA 值

access and filter explicit NA values created by parse_factor()

readr::parse_factor() 是创建因子变量的 tidyverse 方法。默认情况下,它设置 include_na = TRUE:将为传递给 parse_factor() 的向量中的 NA 值创建显式 NA 级别。使用 parse_factor() 创建因子变量后,如何访问或过滤这些“显式 NA”值?

这段代码说明了这个问题:

library(readr)
xFac <- parse_factor(c("a", "b", NA))
levels(xFac)        # NA is a level of xFac
is.na(xFac)         # FALSE FALSE FALSE
xFac == "NA"        # FALSE FALSE FALSE
xFac[!is.na(xFac)]  # a    b    <NA>

在最后一行中,我尝试只获取 xFac 中不属于 NA 的那些值。但是这条线不起作用; NA 值与其他值一起返回。编写此行的正确方法是什么(同时在 xFac 中保留显式 NA 值)?

许多 SO 帖子询问如何过滤普通的 NA 值。这些帖子在这里似乎不相关:我的问题是关于 parse_factor() 创建的“显式 NA”值,并且根据设计,它们的行为方式与普通 NA 值不同。

也许这可以帮助:

#Code 1
xFac <- parse_factor(c("a", "b", NA),include_na = F,na=c('NA'))
#Code 2
xFac[!is.na(xFac)]

输出:

xFac[!is.na(xFac)]
[1] a b
Levels: a b

另外:

xFac
[1] a    b    <NA>
Levels: a b

你可以把它转换成一个字符向量,然后使用is.na()

> xFac
[1] a    b    <NA>
Levels: a b <NA>

> xFac[!is.na(as.character(xFac))]
[1] a b
Levels: a b <NA>

或者您可以使用 %in%

> xFac[!xFac %in% NA]
[1] a b
Levels: a b <NA>

一个因子实际上是一个整数向量,其值表示它对应的水平。

因此,如果您查看级别:

levels(xFac)
#> [1] "a" "b" NA 
is.na(levels(xFac))
#> [1] FALSE FALSE  TRUE

水平居然是NA。所以,你只需要找到xFac中层次为NA的元素,即整数值为3.

as.integer(xFac) == which(is.na(levels(xFac)))
#> [1] FALSE FALSE  TRUE

你可以把它放在一个函数中:

is_na_factor <- function(x){
  as.integer(x) == which(is.na(levels(x)))
}
xFac[! is_na_factor(xFac)]
#> [1] a b
#> Levels: a b <NA>