【问题标题】:Difference between complete.cases and !is.nacomplete.cases 和 !is.na 之间的区别
【发布时间】:2016-02-20 15:00:25
【问题描述】:

我刚刚发现了这个新功能,在我看来它是 !is.na 的改进版本,可能包含在 apply(df, 1) 中。我是正确的还是以下:

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

这并不总是正确的?

【问题讨论】:

  • complete.cases 逐行检查 NA,如果存在则返回 FALSE。它在data.frame 上更有用,因为!is.na(a) 将返回一个与data.frame 相同维度的矩阵,而complete.cases 将返回一个向量,每个向量对应data.frame 的每一行。本质上,DF[complete.cases(DF), ] 将删除所有至少 1 NA 的行,这是一个方便的工具。尽管您显示的用法完全有效,但我没有在矢量上使用它们。
  • 虽然在向量上的快速基准测试表明 !is.na 的速度是原来的两倍(尽管我们谈论的是 0.05 和 0.1 秒)。
  • @Arun -- 我在发布答案时没有看到这条评论。
  • @mnel,不用担心,+1。和往常一样清楚:)

标签: r na


【解决方案1】:

对于原子向量,complete.casesis.na 将是相同的。对于更复杂的对象,情况并非如此。

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

测试

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
【解决方案2】:

让我们采用如下所示的向量 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 作用于 ROW 级别

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    • 2015-10-04
    • 2012-08-12
    • 2011-02-18
    • 2019-12-21
    相关资源
    最近更新 更多