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 |
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,]
eh Bien, vous pourriez changer votre 0
NA
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 rowSums
log
ne seront fini si il n'y a pas de zéros dans une rangée.
dfr[is.finite(rowSums(log(dfr[-1]))),]
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
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),]