Find names of columns which contain missing values
Asked Answered
O

3

49

I want to find all the names of columns with NA or missing data and store these column names in a vector.

# 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

The desired result: columns "aa" and "ee".

My attempt:

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

However, I keep getting integer(0) as my output. Any help is appreciated.

Osmund answered 4/12, 2013 at 0:21 Comment(0)
G
102

Like this?

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

Or as suggested by @thelatemail:

names(which(colSums(is.na(mymatrix)) > 0))
# [1] "aa" "ee"
Groundwork answered 4/12, 2013 at 0:33 Comment(0)
L
21

R 3.1 introduced an anyNA function, which is more convenient and faster:

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

Old answer:

If it's a very long matrix, apply + any can short circuit and run a bit faster.

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"
Lengel answered 4/12, 2013 at 0:47 Comment(0)
E
14

If you have a data frame with non-numeric columns, this solution is more general (building on previous answers):

R 3.1 +

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

or

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

Emmet answered 15/12, 2017 at 20:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.