访问和过滤由 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>
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>