R 按NA水平划分因子子集

R 按NA水平划分因子子集,r,subset,missing-data,na,r-factor,R,Subset,Missing Data,Na,R Factor,我有一个R因子,有一个NA水平 set.seed(1) x <- sample(c(1, 2, NA), 25, replace=TRUE) x <- factor(x, exclude = NULL) > x [1] 1 2 2 <NA> 1 <NA> <NA> 2 2 1 1 [12] 1 <NA> 2 <NA> 2 <NA> <

我有一个R因子,有一个NA水平

set.seed(1)
x <- sample(c(1, 2, NA), 25, replace=TRUE)
x <- factor(x, exclude = NULL)
> x
 [1] 1    2    2    <NA> 1    <NA> <NA> 2    2    1    1   
[12] 1    <NA> 2    <NA> 2    <NA> <NA> 2    <NA> <NA> 1   
[23] 2    1    1   
Levels: 1 2 <NA>
set.seed(1)
x[is.na(x)]
系数(0)
级别:12
>x[x='']
系数(0)
级别:12

令我惊讶的是,您的尝试没有成功,但这似乎是:

x[is.na(levels(x)[x])]
通过查看
str(x)
,我发现是
NA
的级别,而不是底层代码:

str(x)
 Factor w/ 3 levels "1","2",NA: 1 2 2 3 1 3 3 2 2 1 ...

作为Ben的后续行动:

str(x)
显示问题所在。因子在内部以整数形式存储,并进行“查找”排序。因此:

> all(is.na(x))
[1] FALSE
但是

如ben所示,要打印向量的实际值:

> levels(x)[x]
 [1] "1" "2" "2" NA  "1" NA  NA  "2" "2" "1" "1" "1" NA  "2" NA  "2" NA  NA  "2" NA  NA       "1" "2" "1" "1"

> x
 [1] 1    2    2    <NA> 1    <NA> <NA> 2    2    1    1    1    <NA> 2    <NA> 2    <NA> <NA> 2    <NA> <NA> 1    2    1    1
Levels: 1 2 <NA>
>x
[1] 1    2    2     1      2    2    1    1    1     2     2      2      1    2    1    1
级别:12

我认为
x[is.na(as.character(x))]
也有效。我也对这种行为感到惊讶。这可能是
?factor
的一个原因:“警告:与以“NA”为水平的因子相关的一些异常。建议谨慎使用它们,例如,仅用于制表目的。”
> levels(x)[x]
 [1] "1" "2" "2" NA  "1" NA  NA  "2" "2" "1" "1" "1" NA  "2" NA  "2" NA  NA  "2" NA  NA       "1" "2" "1" "1"
> x
 [1] 1    2    2    <NA> 1    <NA> <NA> 2    2    1    1    1    <NA> 2    <NA> 2    <NA> <NA> 2    <NA> <NA> 1    2    1    1
Levels: 1 2 <NA>