查找包含缺失值的列名

48

我想要找到所有包含 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个回答

101

像这样吗?

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

或者像@thelatemail建议的那样:

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

21

R 3.1引入了一个anyNA函数,它更加方便和快速:

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

旧答案:

如果是非常长的矩阵,apply + any 可以短路并且运行更快。

新答案:

对于非常长的矩阵,使用applyany可以实现短路操作,并提高运行速度。

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"

13
如果你有一个数据框包含非数字列,这个解决方案更通用(建立在之前的答案基础上):
R 3.1 + names(which(sapply(mymatrix, anyNA))) 或者 names(which(sapply(mymatrix, function(x) any(is.na(x)))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接