2011-06-22 30 views
54

Mam zestaw danych z pustymi wierszami. Chciałbym je usunąć:Usuwanie pustych wierszy pliku danych w R

myData<-myData[-which(apply(myData,1,function(x)all(is.na(x)))),] 

Działa poprawnie. Ale teraz chciałbym dodać kolumnę w moich danych oraz zainicjować pierwszą wartość:

myData$newCol[1] <- -999 

Error in `$<-.data.frame`(`*tmp*`, "newCol", value = -999) : 
    replacement has 1 rows, data has 0 

Niestety to nie działa, a ja naprawdę nie rozumiem, dlaczego nie mogę rozwiązać ten problem. Działało gdy usunąłem jeden wiersz na raz, używając:

TgData = TgData[2:nrow(TgData),] 

albo coś podobnego.

Działa również wtedy, gdy użyłem tylko pierwszych 13 000 wierszy.

Ale to nie działa z moich rzeczywistych danych, z 32.000 wierszy.

Co zrobiłem źle? Wydaje mi się, że nie ma to dla mnie żadnego sensu.

+0

możliwy duplikat [usunięcia wierszy z NA w data.frame] (http://stackoverflow.com/questions/4862178/remove-rows-with-nas-in-data-frame) –

Odpowiedz

73

Zakładam, że chcesz usunąć wiersze, które są wszystkie NA. Następnie można wykonać następujące czynności:

data <- rbind(c(1,2,3), c(1, NA, 4), c(4,6,7), c(NA, NA, NA), c(4, 8, NA)) # sample data 
data 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 1 NA 4 
[3,] 4 6 7 
[4,] NA NA NA 
[5,] 4 8 NA 

data[rowSums(is.na(data)) != ncol(data),] 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 1 NA 4 
[3,] 4 6 7 
[4,] 4 8 NA 

Jeśli chcesz usunąć wiersze, które mają co najmniej jedną NA, wystarczy zmienić warunek:

data[rowSums(is.na(data)) == 0,] 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 4 6 7 
+23

Drugi przypadek może być również obsługiwany przez : 'data [complete.cases (data),]'. –

+0

Dzięki za napiwek! – Wookai

+0

@JoshuaUlrich Thx za pomoc w udzieleniu odpowiedzi! Tylko dla zrozumienia? Dlaczego pozwalasz ',' na końcu 'danych [complete.cases (data),]' twój kod? – mrquad

26

Jeśli masz pustych wierszy, a nie NAS, wy można zrobić:

data[!apply(data == "", 1, all),] 

Aby usunąć zarówno (NAS i pusty):

data <- data[!apply(is.na(data) | data == "", 1, all),] 
+1

Ta opcja działa również w przypadku danych nieliczbowych. –