Найти столбцы со всеми пропущенными значениями

Я пишу функцию, которой необходимо проверить, имеет ли (и в каком!) Столбец (переменная) все отсутствующие значения (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, например вывести список (имя переменной или номер столбца)?


person SHRram    schedule 04.07.2012    source источник
comment
Я чувствую, что на это, должно быть, уже приходилось отвечать раньше: что-то вроде names(data)[lapply(data,function(x) all(is.na(x)))]   -  person Ben Bolker    schedule 04.07.2012
comment
Ваши круглые скобки неправильные. Напишите colSums(!is.na(data)) == 0 вместо colSums(!is.na(data) == 0).   -  person sgibb    schedule 04.07.2012


Ответы (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
person Andrie    schedule 04.07.2012
comment
спасибо, я намерен добавить сюда как часть функции, чтобы функция останавливалась, если есть какое-либо ИСТИНА ... что важно для меня, так как у меня большой набор данных с ›50000 переменными - person SHRram; 04.07.2012
comment
Вы также можете уменьшить количество вычислений, отметив, что столбцы, состоящие только из NA, будут иметь class logical. Кроме того, если вы не ожидаете никаких других логических столбцов, это дает вам столбцы NA. - person James; 04.07.2012
comment
@ Джеймс: это может быть хрупким. Существуют «классифицированные» версии NA, такие как NA_integer_, которые отображаются как NA, но не логичны. Это может зависеть от того, откуда пришли NA ... - person Ben Bolker; 04.07.2012
comment
Это я, или это решение будет возвращать только ИСТИНА, когда ВСЕ элементы столбца являются Н / Д, а не первоначальный запрос (который возвращает истину, если ЛЮБОЙ элемент был НД)? Я просто попробовал это на data.frame, который имеет две известные строки с НА в них, и получил набор возврата, сообщающий мне, что нет НА ни в одном столбце. - person GT.; 16.11.2013
comment
@GT. Да, это был вопрос в том виде, в каком он был поставлен. Если вы хотите вернуть TRUE, если одно или несколько значений отсутствуют, используйте any() вместо all(). - person Andrie; 16.11.2013

В 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(.))
person Tony Ladson    schedule 26.03.2015

Чтобы найти столбцы, в которых отсутствуют все значения

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

Чтобы проверить, все ли пропущенные значения в столбцах:

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

Чтобы узнать, в каких столбцах отсутствуют все значения:

  test1.nona <- test1[ , colSums(is.na(test1)) == 0]
person PHH13    schedule 07.06.2016

Это сгенерирует имена столбцов, заполненные НА:

library(purrr)
df %>% keep(~all(is.na(.x))) %>% names
person AlexB    schedule 09.09.2019

Подход dplyr для определения количества NA для каждого столбца:

df %>% 
  summarise_all((funs(sum(is.na(.))))) 
person Moh    schedule 13.06.2019
comment
обновленный метод теперь df %>% summarise_all((~ sum(is.na(.)))) - person Emman; 26.08.2020

Следующая команда дает вам красивую таблицу со столбцами, имеющими значения NA:

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

Это улучшение первого полученного ответа, который в некоторых случаях не работает должным образом.

person cs4r    schedule 17.12.2017

sapply(b,function(X) sum(is.na(X))

Это даст вам количество na в каждом столбце набора данных, а также даст 0, если в столбце нет na

person Abhi    schedule 28.06.2020

Вариант dplyr-подхода:

dataframe %>% select_if(function(x) all(is.na(x))) %>% colnames() 
person Arthur Small    schedule 20.02.2021
comment
Совет шляпы: sebastiansauer.github.io/NAs-with-dplyr - person Arthur Small; 20.02.2021