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:有什么方法可以找到哪些列有 all NA,例如输出列表(变量名或列号)?

4

9 回答 9

41

这很容易使用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
于 2012-07-04T13:40:24.343 回答
8

在 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(.))
于 2015-03-26T00:37:49.497 回答
7

查找缺少所有值的列

 allmisscols <- apply(dataset,2, function(x)all(is.na(x)));  
 colswithallmiss <-names(allmisscols[allmisscols>0]);    
 print("the columns with all values missing");    
 print(colswithallmiss);
于 2015-02-25T08:17:32.043 回答
5

这将生成充满 NA 的列名:

library(purrr)
df %>% keep(~all(is.na(.x))) %>% names
于 2019-09-09T14:29:44.783 回答
4

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

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

要获取哪些列具有所有缺失值:

  test1.nona <- test1[ , colSums(is.na(test1)) == 0]
于 2016-06-07T01:52:27.783 回答
3

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

df %>% 
  summarise_all((funs(sum(is.na(.))))) 
于 2019-06-13T07:59:53.023 回答
0

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

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

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

于 2017-12-17T12:43:06.590 回答
0
sapply(b,function(X) sum(is.na(X))

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

于 2020-06-28T07:01:29.617 回答
0

变体 dplyr 方法:

dataframe %>% select_if(function(x) all(is.na(x))) %>% colnames() 
于 2021-02-20T15:10:07.723 回答