查找包含缺失值的列的名称

lev*_*ver 32 r na

我想找到包含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
Run Code Online (Sandbox Code Playgroud)

期望的结果:列"aa""ee".

我的尝试:

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

但是,我不断得到integer(0)我的输出.任何帮助表示赞赏.

Hen*_*rik 62

像这样?

colnames(mymatrix)[colSums(is.na(mymatrix)) > 0]
# [1] "aa" "ee"
Run Code Online (Sandbox Code Playgroud)

  • 没有需要回溯到'mymatrix`的另一种选择是`名称(其中(colSums(is.na(mymatrix))> 0)) (4认同)

Nea*_*ltz 18

R 3.1引入了一个anyNA更方便,更快捷的功能:

colnames(mymatrix)[ apply(mymatrix, 2, anyNA) ]
Run Code Online (Sandbox Code Playgroud)

老答案:

如果它是一个非常长的矩阵,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"
Run Code Online (Sandbox Code Playgroud)


ver*_*our 13

如果您有一个包含非数字列的数据框,则此解决方案更通用(基于以前的答案):

R 3.1 +

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

或者

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