web-dev-qa-db-fra.com

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

J'ai un problème à résoudre pour supprimer des lignes avec une valeur zéro dans R. D'autre part, je peux utiliser na.omit() pour supprimer toutes les valeurs NA ou utiliser complete.cases() pour supprimer les lignes contenant des valeurs NA.

Est-ce que quelqu'un sait comment supprimer des 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    |  
25
YougyZ

Il y a plusieurs 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,]
28
csgillespie

Eh bien, vous pouvez échanger votre 0 contre NA, puis utiliser l’une de ces solutions, mais vous pouvez remarquer qu’un nombre n’aura un logarithme fini que s'il est supérieur à 0, de sorte que rowSums de la log volonté ne soyez fini que s'il n'y a pas de zéros dans une rangée.

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

Je serais probablement d'accord avec la suggestion de Joran de remplacer les 0 par des NA puis d'utiliser les fonctions intégrées que vous avez mentionnées. Si vous ne pouvez pas/ne voulez pas faire cela, une approche consiste à utiliser any() pour rechercher les lignes contenant des 0 et les sous-ensembles de celles-ci:

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 la méthode de Joran, vous devriez commencer par quelque chose comme ceci:

x[x==0] <- NA
4
Chase

Je voudrais faire ce qui suit.

Définissez le zéro sur NA.

 data[data==0] <- NA
 data

Supprimez les lignes associées à NA.

 data2<-data[complete.cases(data),]
2
morteza

Je préfère une simple adaptation de la méthode de csgillespie, évitant ainsi la définition d'une fonction:

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

d est votre trame de données.

1
Robert Yi

Vous pouvez utiliser le filtre du paquet dplyr.

Appelons votre cadre de données df 

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

df1 n'aura que des lignes avec des entrées supérieures à zéro. J'espère que cela t'aides. 

1
Vinay B