2012-05-13 7 views
17

大きな値のデータフレームに欠損値が含まれている列の名前を表示したいとします。基本的には、complete.cases(df)と同じですが、列ではなく行でも同じです。列の一部が非数値ですので、何か data.frameにNAsの列を表示する

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" 

誰かが、NAsを持つ列を識別するためのより効率的な機能を表示できますか?

答えて

24

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

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

EDIT:

私は誰もがそれが完了したので、ここで完全にそれを書いた推測:

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が存在しなかったか、私はそれを知らなかった書いた時点で enter image description here

編集。これはmoreso物事をスピードアップすることがあります... ?anyNAのためのヘルプマニュアルごと:

汎用関数anyNAは(特にアトミックベクトルのための)可能性がより高速な方法でany(is.na(x))を実装しています。ここで

nacols <- function(df) { 
    colnames(df)[unlist(lapply(df, function(x) anyNA(x)))] 
} 
+0

これは完璧に動作します、特にベンチマークのためにありがとう! – Moira

+2

+1良い答え... – Andrie

5

一つの方法である:

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

マノエル

6

一つの方法...

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

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

、それが役に立てば幸い

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

+0

私はdownvoteの理由を知りたいと思うだろう... – Andrie

+0

それは私だった。私は正しい返答をしたすべての人を投票することを意味したが、急いでそれは下票だった。私はあなたが2ではなく0があるのを見た後にそれを認識しましたが、私の投票はロックされました。それを修正する唯一の方法(私は思う)あなたが私が投票を変更することができますあなたの応答を編集する場合です。 –

+0

@タイラーリンカーああ、大丈夫です。すべてが許される。私はマイナーな編集をしました... – Andrie

関連する問題