20

欠損値を含む大きなデータフレームの列の名前を表示したいと思います。基本的に、私は complete.cases(df) と同等のものを望んでいますが、行ではなく列が必要です。一部の列は数値ではないため、次のようなものです

names(df[is.na(colMeans(df))])

「colMeans(df) のエラー: 'x' は数値でなければなりません。」を返します。したがって、私の現在の解決策は、データフレームを転置してcomplete.casesを実行することですが、より効率的なapply(またはplyrの何か)のバリアントがあると思います。

nacols <- function(df) {
  names(df[,!complete.cases(t(df))])
} 

w <- c("hello","goodbye","stuff")
x <- c(1,2,3)
y <- c(1,NA,0)
z <- c(1,0, NA)
tmp <- data.frame(w,x,y,z)

nacols(tmp)
[1] "y" "z"

NAを持つ列を識別するためのより効率的な関数を誰かに教えてもらえますか?

4

3 に答える 3

27

これは私が知っている最速の方法です:

unlist(lapply(df, function(x) any(is.na(x))))

編集:

私は他の誰もがそれを完全に書いたと思うので、ここで完全です:

nacols <- function(df) {
    colnames(df)[unlist(lapply(df, function(x) any(is.na(x))))]
}

また、WIN 7 マシンで 4 つのソリューションをマイクロベンチマークすると、次のようになります。

Unit: microseconds
    expr     min      lq  median      uq        max
1 ANDRIE  85.380  91.911 106.375 116.639    863.124
2 MANOEL  87.712  93.778 105.908 118.971   8426.886
3  MOIRA 764.215 798.273 817.402 876.188 143039.632
4  TYLER  51.321  57.853  62.518  72.316   1365.136

そして、これがそのビジュアルです: ここに画像の説明を入力

編集私が書いた時点では、これanyNAは存在しなかったか、気づいていませんでした. これにより、さらに高速化される可能性があります...のヘルプマニュアルによると?anyNA

ジェネリック関数は、おそらくより高速な方法でanyNA実装さany(is.na(x))れます (特に原子ベクトルの場合)。

nacols <- function(df) {
    colnames(df)[unlist(lapply(df, function(x) anyNA(x)))]
}
于 2012-05-13T18:42:07.520 に答える
6

1 つの方法を次に示します。

colnames(tmp)[colSums(is.na(tmp)) > 0]

それが役に立てば幸い、

マノエル

于 2012-05-13T18:42:32.967 に答える
6

一方通行...

nacols <- function(x){
  y <- sapply(x, function(xx)any(is.na(xx)))
  names(y[y])
}  

nacols(tmp)
[1] "y" "z"

説明: 結果yは論理ベクトルであるため、が TRUEnames(y[y])の場合にのみ y の名前を返します。y

于 2012-05-13T18:43:51.640 に答える