访问和筛选由parse_factor()创建的显式NA值

访问和筛选由parse_factor()创建的显式NA值,r,missing-data,readr,R,Missing Data,Readr,readr::parse_factor()是创建因子变量的好方法。默认情况下,它设置include\u na=TRUE:将为传递到parse\u factor()的向量中的na值创建显式na级别。使用parse_factor()创建因子变量后,如何访问或过滤这些“显式NA”值 此代码说明了该问题: library(readr) xFac <- parse_factor(c("a", "b", NA)) levels(xFac) # NA

readr::parse_factor()
是创建因子变量的好方法。默认情况下,它设置
include\u na=TRUE
:将为传递到
parse\u 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>
库(readr)
xFac也许这有助于:

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

xFac
[1] a b
级别:a b

您可以将其转换为字符向量,然后使用
is.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>
是a还是b
#>级别:a b

谢谢。但我希望找到一种方法来处理
parse_factor()
遇到NA值时默认创建的“显式NA”级别。谢谢。第二个解决方案涉及%
中的
%,非常吸引人,因为它非常简洁。
> 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
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>