【问题标题】:Omit rows containing specific column of NA省略包含特定列的行 NA
【发布时间】:2012-06-30 13:21:20
【问题描述】:

我想知道如何在数据框中省略 NA 值,但仅限于我感兴趣的某些列。

例如,

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))

但我只想省略yNA的数据,因此结果应该是

  x  y  z
1 1  0 NA
2 2 10 33

na.omit 似乎删除了所有包含任何NA 的行。

有人可以帮我解决这个简单的问题吗?

但是,如果现在我将问题更改为:

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA))

如果我只想省略x=naz=na,我可以将| 放在哪里?

【问题讨论】:

    标签: r dataframe na


    【解决方案1】:

    使用is.na

    DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
    DF[!is.na(DF$y),]
    

    【讨论】:

    • 如何将这种方法贪婪地应用于数据集中的所有列?如果任何列值是 NA 跳过。所以你的数据集输出只是第二列。
    • 使用na.omit贪婪地删除任意列na.omit(DF)中所有带有NA的行
    【解决方案2】:

    Hadley 的tidyr 刚刚得到了这个神奇的功能drop_na

    library(tidyr)
    DF %>% drop_na(y)
      x  y  z
    1 1  0 NA
    2 2 10 33
    

    【讨论】:

    • 此方法还允许您指定多个列(用于删除 NA 值)。例如,可以使用 DF %>% drop_na(y,z) 删除 y 和 z 列中的 NA 值。
    【解决方案3】:

    您可以使用complete.cases 函数并将其放入函数中:

    DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
    
    completeFun <- function(data, desiredCols) {
      completeVec <- complete.cases(data[, desiredCols])
      return(data[completeVec, ])
    }
    
    completeFun(DF, "y")
    #   x  y  z
    # 1 1  0 NA
    # 2 2 10 33
    
    completeFun(DF, c("y", "z"))
    #   x  y  z
    # 2 2 10 33
    

    编辑: 只返回没有NAs的行

    如果您想消除任何列中至少有一个NA 的所有行,只需直接使用complete.cases 函数即可:

    DF[complete.cases(DF), ]
    #   x  y  z
    # 2 2 10 33
    

    或者如果completeFun 已经在您的工作流程中根深蒂固;)

    completeFun(DF, names(DF))
    

    【讨论】:

    • 你能让你的方法变得贪婪吗?取所有没有 NA 的列。
    • 你的意思是只返回 rows 而没有NAs?喜欢completeFun(DF, names(DF))
    • 正确!请考虑将其添加到您的答案中,因为这是这里的常见需求。 - - 我认为 mnel 的答案不能像你的那样扩展。你的函数方法很棒!
    • 完成!感谢小费@LéoLéopoldHertz준영
    • 如果您正在查看过去的 2020 年,请帮自己一个忙,看看下面给出的最新答案,例如下面@amrrs 概述的方法使用来自tidyrdrop_na() 做同样的事情但在我看来,今天是一个更好的解决方案。
    【解决方案4】:

    使用“子集”

    DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
    subset(DF, !is.na(y))
    

    【讨论】:

      【解决方案5】:

      na.omit 可以用于data.table

      na.omit(data, cols = c("x", "z"))
      

      【讨论】:

      • cols= 参数在 data.table::na.omit 库中可用。不是基础stats::na.omit
      【解决方案6】:

      如果两个特定列中的任何一个包含&lt;NA&gt;,则省略行。

      DF[!is.na(DF$x)&!is.na(DF$z),]
      

      【讨论】:

        【解决方案7】:

        试试这个:

        cc=is.na(DF$y)
        m=which(cc==c("TRUE"))
        DF=DF[-m,]
        

        【讨论】:

          【解决方案8】:

          试试这个:

          DF %>% t %>% na.omit %>% t
          

          它转置数据框并省略在转置之前为“列”的空行,然后将其转回。

          【讨论】:

          • 请解释一下发生了什么。
          【解决方案9】:

          要更新,tidyverse 方法与dplyr

          library(dplyr)
          
          your_data_frame %>% 
            filter(!is.na(region_column))
          

          【讨论】:

            猜你喜欢
            • 2019-09-07
            • 2016-10-17
            • 2021-03-06
            • 1970-01-01
            • 2012-07-18
            • 1970-01-01
            • 2015-07-07
            • 1970-01-01
            • 2019-06-28
            相关资源
            最近更新 更多