2015-08-06 11 views
11

Chcę usunąć wszystkie kolumny lub wiersze z więcej niż 50% NA s w ramce danych.Usuń kolumny/wiersze z brakiem x%

To jest moje rozwiązanie:

# delete columns with more than 50% missings 
miss <- c() 
for(i in 1:ncol(data)) { 
    if(length(which(is.na(data[,i]))) > 0.5*nrow(data)) miss <- append(miss,i) 
} 
data2 <- data[,-miss] 


# delete rows with more than 50% percent missing 
miss2 <- c() 
for(i in 1:nrow(data)) { 
    if(length(which(is.na(data[i,]))) > 0.5*ncol(data)) miss2 <- append(miss2,i) 
} 
data <- data[-miss,] 

ale szukam ładniejszy/szybszego rozwiązania.

Chciałbym również docenić dplyr rozwiązanie

+0

@Ricky Dodałem moje rozwiązanie wiersza, które jest prawie takie samo – spore234

+0

Aby potwierdzić moje zrozumienie dla dodatkowego rozwiązania wiersza: Więc jeśli wiersz X początkowo ma więcej niż 50% NA, ale po usunięciu kolumny 3 niż kolumna X ma mniej niż 50% NA, wiersza X nie należy usuwać? – Ricky

Odpowiedz

20

Aby usunąć kolumny z pewną ilością NA, można użyć colMeans(is.na(...))

## Some sample data 
set.seed(0) 
dat <- matrix(1:100, 10, 10) 
dat[sample(1:100, 50)] <- NA 
dat <- data.frame(dat) 

## Remove columns with more than 50% NA 
dat[, -which(colMeans(is.na(dat)) > 0.5)] 

i podobnie dla wierszy, używając rowMeans.

+0

, więc jest to 'dat [-which (rowMeans (is.na (dat))> 0.5),]' dla wierszy. dzięki! – spore234

+1

@ spore234 HTH @PierreLafortune po szybkim teście wydaje się być około 3 razy szybszy od równoważnego rozwiązania "sapply" – jenesaisquoi