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

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

# create matrix
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
mymatrix
#      aa bb cc dd ee
# [1,]  1  2  3  4  5
# [2,] NA  7  8  9 10
# [3,] NA 12 13 14 NA
# [4,] 16 17 18 19 20

Желаемый результат: столбцы "aa" а также "ee",

Моя попытка:

bad <- character()
for (j in 1:4){     
  tmp <- which(colnames(mymatrix[j, ]) %in% c("", "NA"))
  bad <- tmp
}

Тем не менее, я продолжаю получать integer(0) как мой вывод. Любая помощь приветствуется.

3 ответа

Решение

Как это?

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

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"

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

R 3.1 +

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

или же

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

Другие вопросы по тегам