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 |
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,]
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]))),]
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
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),]
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),]
où d
est votre trame de données.
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.