web-dev-qa-db-ja.com

欠損値を含む列の名前を見つける

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)を出力として取得し続けます。どんな助けも大歓迎です。

29
lever

このような?

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

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"
18
Neal Fultz

非数値列を含むデータフレームがある場合、このソリューションはより一般的です(以前の回答に基づいて構築されます)。

R 3.1 +

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

または

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

4
verbamour