Comment supprimer des lignes avec une valeur zéro en R?

j'ai un problème pour résoudre comment supprimer des lignes avec une valeur zéro dans R. dans d'autres mains, je peux utiliser na.omit() pour supprimer toutes les valeurs NA ou utiliser complete.cases() pour supprimer les lignes qui contiennent des valeurs de NA.

Est-ce que quelqu'un sait comment supprimer les lignes avec une valeur zéro dans R?

Par exemple :

Avant

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

Aprè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    |  
22
demandé sur micstr 2012-04-02 17:48:26

5 réponses

Il y a quelques différentes façons de le faire. Je préfère utiliser apply, car il est facilement 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,]
27
répondu csgillespie 2012-04-02 14:01:15

eh Bien, vous pourriez changer votre 0NA et puis utilisez l'une de ces solutions, mais pour faire une différence, vous pourriez remarquer qu'un nombre n'aura un logarithme fini que s'il est plus grand que 0, ainsi que rowSumslog ne seront fini si il n'y a pas de zéros dans une rangée.

dfr[is.finite(rowSums(log(dfr[-1]))),]
5
répondu James 2012-04-02 14:06:53

je suivrais probablement la suggestion de Joran de remplacer les 0 par des NAs et d'utiliser ensuite les fonctions intégrées que vous avez mentionnées. Si vous ne pouvez pas/ne voulez pas faire cela, une approche est d'utiliser any() pour rechercher les lignes qui contiennent de 0 et de sous-ensemble de ces:

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

Pour mettre en œuvre Joran de la méthode, quelque chose comme cela devrait vous permettre de commencer:

x[x==0] <- NA
4
répondu Chase 2012-04-02 14:05:51
d[apply(d!=0, 1, all),]

d est votre bloc de données.

1
répondu Robert Yi 2017-12-20 21:45:32

je ferais ce qui suit.

Réglez le zéro sur NA.

 data[data==0] <- NA
 data

supprimer les lignes associées à NA.

 data2<-data[complete.cases(data),]
1
répondu morteza 2018-05-14 20:50:11