【问题标题】:Find columns with all missing values查找所有缺失值的列
【发布时间】:2012-07-05 00:28:32
【问题描述】:

我正在编写一个函数,它需要检查是否(以及哪个!)列(变量)具有所有缺失值(NA<NA>)。以下是函数片段:

test1 <- data.frame (matrix(c(1,2,3,NA,2,3,NA,NA,2), 3,3))
test2 <- data.frame (matrix(c(1,2,3,NA,NA,NA,NA,NA,2), 3,3))

na.test <-  function (data) {
  if (colSums(!is.na(data) == 0)){
      stop ("The some variable in the dataset has all missing value,
     remove the column to proceed")
      }
      }
na.test (test1)

Warning message:
In if (colSums(!is.na(data) == 0)) { :
  the condition has length > 1 and only the first element will be used

Q1:为什么会出现上述错误以及任何修复?

Q2:有没有什么办法可以找出哪些列中的所有NA,例如输出列表(变量名或列号)?

【问题讨论】:

  • 我觉得这个问题之前一定有人回答过:names(data)[lapply(data,function(x) all(is.na(x)))]
  • 你的括号错了。写colSums(!is.na(data)) == 0 而不是colSums(!is.na(data) == 0)

标签: r dataframe na


【解决方案1】:

变体 dplyr 方法:

dataframe %>% select_if(function(x) all(is.na(x))) %>% colnames() 

【讨论】:

【解决方案2】:
sapply(b,function(X) sum(is.na(X))

这将为您提供数据集每一列中的 na 计数,如果列中不存在 na,则也将给出 0

【讨论】:

    【解决方案3】:

    这个会生成满是NA的列名:

    library(purrr)
    df %>% keep(~all(is.na(.x))) %>% names
    

    【讨论】:

      【解决方案4】:

      dplyr 方法来查找每列的 NA 数量:

      df %>% 
        summarise_all((funs(sum(is.na(.))))) 
      

      【讨论】:

      • 更新后的方法现在是df %&gt;% summarise_all((~ sum(is.na(.))))
      【解决方案5】:

      以下命令为您提供了一个漂亮的表格,其中包含具有 NA 值的列:

      sapply(dataframe, function(x)all(any(is.na(x))))
      

      这是对你得到的第一个答案的改进,在某些情况下它不能正常工作。

      【讨论】:

        【解决方案6】:

        在 dplyr 中

        ColNums_NotAllMissing <- function(df){ # helper function
          as.vector(which(colSums(is.na(df)) != nrow(df)))
        }
        
        df %>%
        select(ColNums_NotAllMissing(.))
        
        example:
        x <- data.frame(x = c(NA, NA, NA), y = c(1, 2, NA), z = c(5, 6, 7))
        
        x %>%
        select(ColNums_NotAllMissing(.))
        

        或者,反过来

        Cols_AllMissing <- function(df){ # helper function
          as.vector(which(colSums(is.na(df)) == nrow(df)))
        }
        
        
        x %>%
          select(-Cols_AllMissing(.))
        

        【讨论】:

          【解决方案7】:

          测试列是否有所有缺失值:

          apply(test1,2,function(x) {all(is.na(x))})
          

          要获取所有缺失值的列:

            test1.nona <- test1[ , colSums(is.na(test1)) == 0]
          

          【讨论】:

            【解决方案8】:

            查找所有值缺失的列

             allmisscols <- apply(dataset,2, function(x)all(is.na(x)));  
             colswithallmiss <-names(allmisscols[allmisscols>0]);    
             print("the columns with all values missing");    
             print(colswithallmiss);
            

            【讨论】:

              【解决方案9】:

              使用sapply 和一个小的匿名函数很容易:

              sapply(test1, function(x)all(is.na(x)))
                 X1    X2    X3 
              FALSE FALSE FALSE 
              
              sapply(test2, function(x)all(is.na(x)))
                 X1    X2    X3 
              FALSE  TRUE FALSE 
              

              在函数内部:

              na.test <-  function (x) {
                w <- sapply(x, function(x)all(is.na(x)))
                if (any(w)) {
                  stop(paste("All NA in columns", paste(which(w), collapse=", ")))
                }
              }
              
              na.test(test1)
              
              na.test(test2)
              Error in na.test(test2) : All NA in columns 2
              

              【讨论】:

              • 谢谢,我打算在这里作为函数的一部分,以便函数在有任何 TRUE 时停止......这对我来说很重要,因为我有 > 50000 个变量的大数据集
              • 您还可以通过注意仅由NA 组成的列将是class logical 来减少计算次数。此外,如果您不期望任何其他逻辑列,那么这将为您提供 NA 列。
              • @James:这可能很脆弱。有NA 的“分类”版本,例如NA_integer_,显示为NA,但不合逻辑。这可能取决于NAs 的来源......
              • 是我,还是仅当列的所有元素均为 NA 时,此解决方案才返回“TRUE”,而不是初始请求(如果任何元素为 NA,则返回 true)?我刚刚在一个 data.frame 上尝试了它,它有两个已知的行,其中包含 NA,并得到一个返回集,告诉我任何列中都没有 NA。
              • @GT。是的,这就是提出的问题。如果您想在缺少一个或多个值时返回 TRUE,请使用 any() 而不是 all()
              猜你喜欢
              • 1970-01-01
              • 2019-12-13
              • 1970-01-01
              • 1970-01-01
              • 2019-07-18
              • 2013-09-29
              • 1970-01-01
              • 1970-01-01
              • 2013-12-20
              相关资源
              最近更新 更多