complete.cases和!is.na的区别

4

我刚刚发现了这个新函数,它似乎是!is.na的改进版本,可能被包装在apply(df, 1)中。我是正确的吗?还是说:

> a<-c(1,2,4,NA,6,8)
> identical(complete.cases(a), !is.na(a))
[1] TRUE

这并不总是正确的吗?


4
complete.cases 会按行检查是否有 NA,如果存在则返回 FALSE。在 data.frame 上它更为有用,因为 !is.na(a) 会返回与 data.frame 相同维度的矩阵,而 complete.cases 则会返回一个向量,每个元素对应 data.frame 的一行。实质上,DF[complete.cases(DF), ] 将删除至少有一个 NA 的所有行,这是一个方便的工具。我虽然没有在向量上使用过它们,但你所展示的用法是完全有效的。 - Arun
1
尽管在向量上进行快速基准测试表明 !is.na 的速度是两倍的(即使我们谈论的是0.05和0.1秒),但这并不代表它就是最优选择。 - Arun
@Arun - 我在回答时没有看到这条评论。 - mnel
@mnel,不用担心,+1。这和往常一样清晰 :) - Arun
2个回答

6

对于原子向量,complete.casesis.na是相同的。但对于更复杂的对象来说,这种情况并不一定成立。

例如,对于数据框,is.na.data.frame将返回与输入相同维度的逻辑矩阵。

test <- data.frame(a, b =1)

is.na(test)
#          a     b
# [1,] FALSE FALSE
# [2,] FALSE FALSE
# [3,] FALSE FALSE
# [4,]  TRUE FALSE
# [5,] FALSE FALSE
#[6,] FALSE FALSE
complete.cases(test)
# [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE

嗨,谢谢。所以你确认 identical(complete.cases(df), apply(df, 1, function(x) any(!is.na(x))))==TRUE 是相同的。 - nigmastar

1

让我们将向量r1和矩阵/表格r2如下,并解释结果。

> r1
 [1] 11.3 10.4   NA 11.7 10.8 11.7 10.1  9.8 12.1  1.5  1.8
> r2
    speed mxPH mnO2
60 medium 6.60 11.3
61 medium 6.50 10.4
62 medium 6.40   NA
63   high 7.83 11.7
64   high 7.57 10.8
65   high 7.19 11.7
66   high 7.44 10.1
67   high 7.14  9.8
68   high 7.00 12.1
69 medium 7.50  1.5
70 medium 7.50  1.8

is.na和complete.cases对向量的处理方式相同

> **is.na(r1)**
 [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> **complete.cases(r1)**
 [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

现在让我们看看这两个命令在二维数据中都给出了什么。
正如您所看到的,is.na作用于单个值,而complete.cases作用于行级别。
> **is.na(r2)**
   speed  mxPH  mnO2
60 FALSE FALSE FALSE
61 FALSE FALSE FALSE
62 FALSE FALSE  TRUE
63 FALSE FALSE FALSE
64 FALSE FALSE FALSE
65 FALSE FALSE FALSE
66 FALSE FALSE FALSE
67 FALSE FALSE FALSE
68 FALSE FALSE FALSE
69 FALSE FALSE FALSE
70 FALSE FALSE FALSE

> **complete.cases(r2)**
 [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接