2012-04-02 25 views
19

Ho un problema per risolvere come rimuovere righe con un valore Zero in R. In altre mani, posso usare na.omit() per eliminare tutti i valori NA o usare complete.cases() per eliminare righe che contengono valori NA.Come rimuovere le righe con un valore Zero in R?

C'è qualcuno sa come rimuovere le righe con valori zero in R?

Ad esempio:

Prima

| DateTime  | Mac1 | Mac2 | Mac3 | Mac4 | 
---------------------------------------------------- 
| 2011-04-02 06:00 | 20 | 0  | 20 | 20 | 
| 2011-04-02 06:05 | 21 | 21 | 21 | 21 | 
| 2011-04-02 06:10 | 22 | 22 | 22 | 22 | 
| 2011-04-02 06:15 | 23 | 23 | 0  | 23 | 
| 2011-04-02 06:20 | 24 | 24 | 24 | 24 | 
| 2011-04-02 06:25 | 0  | 25 | 25 | 0  | 

Dopo

| DateTime  | Mac1 | Mac2 | Mac3 | Mac4 | 
---------------------------------------------------- 
| 2011-04-02 06:05 | 21 | 21 | 21 | 21 | 
| 2011-04-02 06:10 | 22 | 22 | 22 | 22 | 
| 2011-04-02 06:20 | 24 | 24 | 24 | 24 | 
+1

Un percorso: riduci questo problema a un problema che hai già risolto sostituendo gli zeri con NA. – joran

+0

Grazie Joran, per la tua risposta .. Ma, non capisco, che mezzo di sostituire gli zeri con NA? Perché prima di ottenere la tabella ho già cancellato i valori di NA. Ma ci sono ancora i valori di 0. Potresti dirmi come si fa? – YougyZ

+0

Ok penso che devo usare questo codice per sostituire 0 con NAs. 'data [which (data == 0)] = NA' – YougyZ

risposta

27

Ci sono diversi modi di fare questo. Io preferisco usare apply, dal momento che è facilmente estendibile:

##Generate some data 
dd = data.frame(a = 1:4, b= 1:0, c=0:3) 

##Go through each row and determine if a value is zero 
row_sub = apply(dd, 1, function(row) all(row !=0)) 
##Subset as usual 
dd[row_sub,] 
4

Beh, si potrebbe scambiare i tuoi 0 's per NA e quindi utilizzare una di queste soluzioni, ma per amore di una differenza, si potrebbe notare che un numero sarà solo un logaritmo finito se è maggiore di 0, in modo che rowSums dello log sia finito solo se non ci sono zeri in una riga.

dfr[is.finite(rowSums(log(dfr[-1]))),] 
+1

+1 per intelligente, ma preferirei sicuramente una soluzione 'all' /' any' nella pratica ... –

4

Probabilmente andrei con il suggerimento di Joran di sostituire gli 0 con NA e quindi utilizzare le funzioni incorporate che hai citato. Se non si può/non si vuole fare questo, un approccio è quello di utilizzare any() per trovare righe che contengono 0 e sottoinsieme quelli fuori:

set.seed(42) 
#Fake data 
x <- data.frame(a = sample(0:2, 5, TRUE), b = sample(0:2, 5, TRUE)) 
> x 
    a b 
1 2 1 
2 2 2 
3 0 0 
4 2 1 
5 1 2 
#Subset out any rows with a 0 in them 
#Note the negation with ! around the apply function 
x[!(apply(x, 1, function(y) any(y == 0))),] 
    a b 
1 2 1 
2 2 2 
4 2 1 
5 1 2 

Per implementare il metodo di Joran, qualcosa di simile dovrebbe iniziare :

x[x==0] <- NA 
+0

grazie comunque, ma l'ho fatto con la soluzione csgillespie ..;) – YougyZ

0

preferisco un semplice adattamento del metodo di csgillespie, rinunciando alla necessità di una definizione di funzione:

d[apply(d!=0, 1, all),] 

dove d sei tu r frame di dati.

Problemi correlati