2012-05-13 17 views
17

Chciałbym wyświetlić nazwy kolumn w dużej ramce danych, które zawierają brakujące wartości. Zasadniczo chcę odpowiednik complete.cases (df), ale dla kolumn, a nie wierszy. Niektóre z kolumn są non-numeryczne, więc cośPokaż kolumny z NA w data.frame

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

zwrotów „Błąd w colMeans (DF).«X»musi być liczbą” Tak więc, moim obecnym rozwiązaniem jest transponowanie ramki danych i uruchamianie kompletnych plików, ale domyślam się, że istnieje pewien wariant zastosowania (lub czegoś w plyrze), który jest znacznie bardziej wydajny.

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" 

Czy ktoś może mi pokazać bardziej wydajną funkcję identyfikacji kolumn z NA?

Odpowiedz

24

To najszybszy sposób, że wiem:

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

EDIT:

Chyba wszyscy napisali go kompletna więc tutaj to jest kompletna:

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

A jeśli microbenchmark 4 rozwiązania na maszynie WIN 7:

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 

A oto wizualna że: enter image description here

Edit W tym czasie napisałem ten anyNA nie istnieje lub byłem nieświadomy. Może to przyspieszyć moreso ... za pomoc instrukcji dla ?anyNA:

Ogólny funkcja anyNA realizuje any(is.na(x)) w możliwie szybszy sposób (zwłaszcza dla wektorów atomowych).

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

To działa idealnie, dzięki, szczególnie dla benchmarków! – Moira

+2

+1 ładna odpowiedź ... – Andrie

5

Oto jeden sposób:

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

Nadzieja pomaga,

Manoel

6

Jednym ze sposobów ...

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

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

Objaśnienie: ponieważ wynikiem y jest wektor logiczny, names(y[y]) zwraca nazwy y tylko w tych przypadkach, w których y ma wartość PRAWDA.

+0

Byłbym zainteresowany, by poznać powód upadku ... – Andrie

+0

Andrie to byłem ja. Miałem zamiar oddać głos wszystkim, którzy udzielili poprawnej odpowiedzi, ale w moim pośpiechu było to głosowanie w dół. Zrozumiałem to później, kiedy zobaczyłem, że masz 0 zamiast 2, ale wtedy mój głos został zablokowany. Jedynym sposobem na naprawienie tego (chyba) jest to, że jeśli zmienisz swoją odpowiedź, mogę zmienić głos. –

+0

@TylerRinker Ah, ok. Wszystko jest przebaczone. Dokonałem niewielkiej edycji ... – Andrie

Powiązane problemy