【问题标题】:summary still shows NAs after using both na.omit and complete.cases使用 na.omit 和 complete.cases 后,summary 仍然显示 NA
【发布时间】:2014-02-27 20:44:52
【问题描述】:

我是一名使用 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)

【问题讨论】:

  • 想通了! Periosna=Perios[is.na(Perios$Periostitis)==FALSE,] 摘要(Periosna)
  • 如果您认为这可能对未来的访问者有所帮助,请在您的解决方案中发布答案并接受它。否则,请删除此问题。
  • OP,杜克林说的。请发布答案或删除。 complete.casesPerios[!is.na(Perios$Periostitis),] 有什么不同,我很好奇?
  • @smci 当且仅当没有其他列包含 NA 值时相同。

标签: r summary na


【解决方案1】:
  1. 错误是您实际上没有分配来自na.omit 的输出!

    Perios <- na.omit(Perios)

  2. 如果您知道 NA 出现在哪一列,那么您就可以这样做

    Perios[!is.na(Perios$Periostitis),]

或更笼统地说:

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

然后作为 R 的一般安全提示,输入 na.fail 以断言它有效:

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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2022-01-19
      • 2018-10-15
      • 2021-06-09
      相关资源
      最近更新 更多