2012-04-02 441 views
19

Tengo un problema para resolver cómo eliminar filas con un valor cero en R. En otras, puedo usar na.omit() para borrar todos los valores de NA o usar complete.cases() para eliminar filas que contengan valores de NA.¿Cómo eliminar filas con un valor cero en R?

¿Alguien sabe cómo eliminar filas con valores cero en R?

Por ejemplo:

Antes

| 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  | 

Después

| 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

Una ruta: reduzca esto a un problema que ya ha resuelto reemplazando los ceros con NA. – joran

+0

Gracias Joran, por su respuesta. Pero, no entiendo, ¿qué significa reemplazar los ceros con NA? Porque antes de obtener la tabla, he eliminado los valores de NA antes. Pero todavía hay valores de 0. ¿Podría decirme cómo hacerlo? – YougyZ

+0

Ok, creo que debo usar este código para reemplazar 0 con NA .. 'data [which (data == 0)] = NA' – YougyZ

Respuesta

27

Hay algunas maneras diferentes de hacer esto. Yo prefiero usar apply, ya que es fácilmente ampliable:

##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

Bueno, se podría intercambiar sus 0 's para NA y luego usar una de esas soluciones, sino por causa de una diferencia, se podía notar que un número se solo tiene un logaritmo finito si es mayor que 0, por lo que rowSums del log solo será finito si no hay ceros en una fila.

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

+1 por inteligente, pero ciertamente preferiría una solución 'all' /' any' en la práctica ... –

4

probablemente me iría con la sugerencia de reemplazar a 0 de la AN y luego utilizando el construido en funciones que usted ha mencionado Joran. Si no puede/no quiero hacer eso, un enfoque consiste en utilizar any() para encontrar las filas que contienen 0 y subconjuntos de los Salida:

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 

Para poner en práctica el método de Joran, algo como esto debería empezar :

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

gracias de todos modos, pero lo he hecho con la solución csgillespie ...;) – YougyZ

0

prefiero una simple adaptación del método de csgillespie, renunciando a la necesidad de una definición de función:

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

donde d es usted r marco de datos.

Cuestiones relacionadas