摘要仍显示使用na.omit和complete.cases后的NA

时间:2014-02-27 20:44:52

标签: r summary na

我是一名使用R的研究生,并且一直在阅读有关从数据框中删除包含NA的行的其他Stack Overflow答案。我试过了na.omit和complete.cases。当使用它们时,它表明已经删除了具有NA的行,但是当我写出summary(data.frame)时,它仍然包含NA。实际上是删除了带NA的行还是我做错了?

na.omit(Perios)
summary(Perios)

Perios[complete.cases(Perios),]
summary(Perios)

2 个答案:

答案 0 :(得分:1)

  1. 错误是您实际上没有分配na.omit的输出!

    Perios< - na.omit(Perios)

  2. 如果您知道NAs出现在哪一列,那么您可以执行

    Perios [!is.na(Perios $骨膜炎)]

  3. 或更一般地说:

    Perios[!is.na(Perios$colA) & !is.na(Perios$colD) & ... ,]
    

    然后作为R的一般安全提示,抛出一个na.fail断言它有效:

    na.fail(Perios)  # trust, but verify! Die Paranoia ist gesund.
    

答案 1 :(得分:1)

is.na不是正确的功能。您想要complete.cases,并希望complete.cases相当于function(x) apply(is.na(x), 1, all)na.omit来过滤数据:

也就是说,您希望所有没有NA值的行。

< x <- data.frame(a=c(1,2,NA), b=c(3,NA,NA))
> x
   a  b
1  1  3
2  2 NA
3 NA NA

> x[complete.cases(x),]
  a b
1 1 3

> na.omit(x)
  a b
1 1 3

然后将其分配回x以保存数据。

complete.cases返回一个向量,输入数据帧的每一行一个元素。另一方面,is.na返回一个矩阵。这不适合返回完整的情况,但可以将所有非NA值作为向量返回:

> is.na(x)
         a     b
[1,] FALSE FALSE
[2,] FALSE  TRUE
[3,]  TRUE  TRUE


> x[!is.na(x)]
[1] 1 2 3