Tengo un problema a resolver ¿cómo eliminar filas con un valor Cero en R. En otros de la mano, puedo usar na.omit() para eliminar todos los valores de NA o uso complete.cases() para eliminar las filas que contiene NA valores.

Hay alguien que sabe cómo eliminar filas con Valores Cero en R?

Por ejemplo :

Antes de

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

|    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    |  
  • Una ruta: reducir a un problema que ya han resuelto mediante la sustitución de los ceros con NAs.
  • Gracias Joran, por tu respuesta.. Pero, no entiendo, ¿qué decir de la sustitución de los ceros con NAs? Porque antes de que me la tabla de haber eliminado NAs valores de antes. Pero todavía hay 0 valores. Podría usted decirme cómo hacerlo?
  • Ok creo que me debe utilizar este código para reemplazar a 0 con NAs.. data[which(data==0)] = NA
  • Creo que en su lugar usted necesita data[which(data==0)] = NA_character_
InformationsquelleAutor YougyZ | 2012-04-02

6 Comentarios

  1. 33

    Hay un par de maneras diferentes de hacer esto. Yo prefiero usar apply, ya que es fácilmente extensible:

    ##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,]
  2. 7

    Bien, que podría cambiar su 0‘s para NA y, a continuación, utilizar una de esas soluciones, pero por el bien de una diferencia, usted puede darse cuenta de que un número sólo tiene un número finito de logaritmo si es mayor que 0, por lo que rowSums de la log sólo será finito si no hay ceros en una fila.

    dfr[is.finite(rowSums(log(dfr[-1]))),]
    • +1 para el inteligente, pero yo sin duda prefiero un all/any solución en la práctica …
  3. 5

    Probablemente me vaya con Joran la sugerencia de sustituir a 0 con NAs y, a continuación, utilizando el incorporado en las funciones que usted ha mencionado. Si usted no puede/no quiere hacer eso, un método es utilizar any() para buscar las filas que contienen 0 y subconjunto de aquellos:

    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 implementar Joran del método, algo así debería comenzar:

    x[x==0] <- NA
    • gracias de todos modos, pero yo la he hecho con csgillespie solución.. 😉
  4. 4

    Usted puede utilizar el filtro de dplyr paquete.

    Vamos a llamar el marco de datos df

    library(dplyr)
    df1 <- filter(df, Mac1 > 0, Mac2 > 0, Mac3 > 0, Mac4 > 0)

    df1 tendrá sólo las filas con las entradas por encima de cero. Espero que esto ayude.

  5. 3

    Yo haría lo siguiente.

    Establecer el cero a NA.

     data[data==0] <- NA
     data

    Eliminar las filas asociadas con NA.

     data2<-data[complete.cases(data),]
  6. 1

    Prefiero una simple adaptación de csgillespie del método anterior la necesidad de una definición de función:

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

    donde d es el marco de datos.

    • Esto no funciona para mí, pero esto funciona: d[!aplicar(d==0, 1, todos),]

Dejar respuesta

Please enter your comment!
Please enter your name here