访问和筛选由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>