【问题标题】:Subset a factor by NA levels按 NA 水平对因子进行子集
【发布时间】:2012-01-26 16:22:11
【问题描述】:

我在 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>

如何按&lt;NA&gt; 级别对该因子进行子集化?我试过的两种方法都不行。

> x[is.na(x)]
factor(0)
Levels: 1 2 <NA>
> x[x=='<NA>']
factor(0)
Levels: 1 2 <NA>

【问题讨论】:

  • 这可能是?factor 的原因之一:“警告:有一些异常与以 'NA' 作为水平的因素相关。建议谨慎使用它们,例如,仅用于制表目的。”

标签: r subset missing-data na r-factor


【解决方案1】:

令我惊讶的是,您尝试这样做没有奏效,但这似乎是:

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 ...

【讨论】:

  • 我认为x[is.na(as.character(x))] 也可以。我也对这种行为感到惊讶。
【解决方案2】:

作为 Ben 的后续行动:

str(x) 向您显示问题。因子在内部以整数形式存储,并具有某种“查找”功能。所以:

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

但是

> any(is.na(levels(x)))
[1] TRUE

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

> 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多