2012-05-13 29 views
17

मैं उन बड़े डेटाफ्रेम में कॉलम के नाम दिखाना चाहता हूं जिनमें अनुपलब्ध मान हैं। असल में, मैं full.cases (डीएफ) के बराबर चाहता हूं लेकिन कॉलम के लिए, पंक्तियां नहीं। स्तंभों में से कुछ गैर-संख्यात्मक हैं, इसलिएडेटा में फ्रेम के साथ कॉलम दिखाएं। फ्रेम

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

रिटर्न की तरह कुछ "त्रुटि colMeans में (DF):। 'एक्स' अंकीय होना चाहिए" इसलिए, मेरा वर्तमान समाधान डेटाफ्रेम को स्थानांतरित करना और पूर्ण.cases चलाएं, लेकिन मुझे लगता है कि लागू करने के कुछ प्रकार (या प्लीयर में कुछ) है जो कि अधिक कुशल है।

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" 

क्या कोई मुझे एनएएस वाले कॉलम की पहचान करने के लिए एक और अधिक कुशल कार्य दिखा सकता है?

उत्तर

24

यह सबसे तेज़ तरीका है कि मैं के बारे में पता है:

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 

और यहाँ इस बात का एक दृश्य है: enter image description here

संपादित समय मैंने लिखा इस anyNA मौजूद नहीं था या मैं इसके बारे में पता नहीं था पर। यह चीजों को तो और अधिक ?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] 

आशा है कि यह मदद करता है

Manoel

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 सत्य है।

+0

मुझे डाउनवोट के कारण जानने की इच्छा होगी ... – Andrie

+0

एंड्री यह मैं था। मेरा मतलब उन सभी को वोट देना था जिन्होंने सही प्रतिक्रिया दी लेकिन मेरे जल्दबाजी में यह एक कम वोट था। मुझे बाद में एहसास हुआ जब मैंने देखा कि आपके पास 2 के बजाय 0 था लेकिन फिर मेरा वोट बंद कर दिया गया। इसे ठीक करने का एकमात्र तरीका (मुझे लगता है) अगर आप अपनी प्रतिक्रिया संपादित करते हैं तो मैं वोट बदल सकता हूं। –

+0

@TylerRinker आह, ठीक है। सब माफ है। मैंने एक मामूली संपादन किया है ... – Andrie

संबंधित मुद्दे