2009-01-24 27 views
10

Mam CSV z pliku danych, które można załadować na badania z użyciem read.csv()Filtrowanie danych w R

Niektóre z danych brakuje, więc chcę, aby zmniejszyć ramkę danych w dół, aby ustawić, które składa się w całości z non -misujące dane, tj. jeśli w dowolnym miejscu pojawi się NULL, chcę wykluczyć tę kolumnę i wiersz z przefiltrowanego zestawu danych.

Wiem, że prawdopodobnie mogę to zrobić po prostu z wbudowanymi operacjami wektorowymi R, ale nie jestem do końca pewien, jak to zrobić dokładnie?

Aby moje pytanie było trochę bardziej konkretne, oto krótka próbka danych, dzięki czemu można zobaczyć, co chcę zrobić.

DocID  Anno1 Anno7 Anno8 
1   7  NULL 8 
2   8  NULL 3 
44   10  2  3 
45   6  6  6 
46   1  3  4 
49   3  8  5 
62   4  NULL 9 
63   2  NULL 4 
67   11  NULL 3 
91   NULL  9  7 
92   NULL  7  5 
93   NULL  8  8 

Tak więc biorąc pod uwagę to wejście, potrzebuję trochę kodu, który zredukuje wyjście do tego.

DocID  Anno8 
44   3 
45   6 
46   4 
49   5 

jako Anno8 jest tylko kolumna dane NULL, i są tylko cztery rzędy z danymi nie NULL.

Odpowiedz

7

Jeśli x jest twój data.frame (lub matrix) następnie

x[ ,apply(x, 2, function(z) !any(is.na(z)))] 

Ponieważ przykład używa NULL, is.na(·) zostaną zastąpione przez is.null(·)

Alternatywnie można spojrzeć na subset(·).

+0

Dzięki @rguha, jest to przydatne. Jak by to działało, gdybym chciał pozbyć się w określonej kolumnie csv jakiejkolwiek wartości, która jest mniejsza niż powiedzmy 5? – Rodolphe

19

Możesz usunąć dowolny wiersz zawierający brak, używając na.omit(), ale to nie jest to, czego chcesz. Co więcej, obecnie zaakceptowana odpowiedź jest błędna. Daje ci kompletne kolumny, ale nie upuszcza wierszy, które mają jedną lub więcej brakujących wartości, o to właśnie pytano. Prawidłowa odpowiedź można otrzymać jako:

> a <- data.frame(a=c(1,2),b=c(NA,1), c=c(3,4)) 
> a 
    a b c 
1 1 NA 3 
2 2 1 4 
> na.omit(a)[,colSums(is.na(a))==0] 
    a c 
2 2 4 

Aby zobaczyć, że powyższa odpowiedź jest źle:

> a[ ,apply(a, 2, function(z) !any(is.na(z)))] 
    a c 
1 1 3 
2 2 4 

Wiersz 1 powinny zostać usunięte ze względu na NA w kolumnie 2.

2
a <- data.frame(a=c(1,2,0,1),b=c(NA,1,NA,1), c=c(3,4,5,1)) 

na.omit(a) 
    a b c 
2 2 1 4 
4 1 1 1 

a[rowSums(is.na(a))==0,] 
    a b c 
2 2 1 4 
4 1 1 1 

a[complete.cases(a),] 
    a b c 
2 2 1 4 
4 1 1 1 
+3

Nie rozumiem tej odpowiedzi. To zawsze zwróci tylko jeden wiersz –

+1

Naprawiono teraz, dziękuję –