Найти имена столбцов, которые содержат отсутствующие значения

Я хочу найти все имена столбцов с NA или отсутствующие данные и сохранить эти имена столбцов в векторе. Это моя последняя попытка:

a <- c(1,2,3,4,5,NA,7,8,9,10,NA,12,13,14,NA,16,17,18,19,20)
cnames <- c("aa", "bb","cc","dd","ee")
mymatrix <- matrix(a, nrow=4, ncol=5, byrow=TRUE,)
colnames(mymatrix) <- cnames
bad <- character()
for (j in 1:4){     
  tmp <- which(colnames(mymatrix[j,])%in%c("","NA"))
  bad <- tmp
}

Я продолжаю получать integer(0) в качестве своего вывода, когда ожидаю "aa" "ee". Любая помощь приветствуется.

Ответы

Ответ 1

Как это?

colnames(mymatrix)[colSums(is.na(mymatrix)) > 0]
# [1] "aa" "ee"

Ответ 2

R 3.1 ввел функцию anyNA, которая удобнее и быстрее:

colnames(mymatrix)[ apply(mymatrix, 2, anyNA) ]

Старый ответ:

Если это очень длинная матрица, apply + any может замыкаться и работать немного быстрее.

apply(is.na(mymatrix), 2, any)
#   aa    bb    cc    dd    ee 
# TRUE FALSE FALSE FALSE  TRUE 
colnames(mymatrix)[apply(is.na(mymatrix), 2, any)]
# [1] "aa" "ee"

Ответ 3

Если у вас есть кадр данных с нечисловыми столбцами, это решение является более общим (основываясь на предыдущих ответах):

R 3.1 +

names(which(sapply(mymatrix, anyNA)))

или

names(which(sapply(mymatrix, function(x) any(is.na(x)))))