2013-12-04 5 views
17

Я хочу найти все имена столбцов с 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) как мой, когда я вывод жду «аа», «Й». Любая помощь приветствуется.

ответ

34

Нравится?

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

Ровно! Спасибо. Я все еще не понимаю, почему я не смог его решить, используя (colnames) – lever

+3

Альтернативой без ссылки на «mymatrix» является 'names (which (colSums (is.na (mymatrix))> 0)) ' – thelatemail

+0

@lever - потому что имена кодов никогда не были NA - значения NA являются значениями в каждом столбце фактических данных, а не именами. Попробуйте 'colnames (mymatrix)', чтобы увидеть, что нет никакого вида 'NA' – thelatemail

12

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" 
0

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

R 3,1 +

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

или

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

Смежные вопросы