it-swarm.com.de

Wie entferne ich Zeilen mit einem Nullwert in R?

Ich habe ein Problem zu lösen, wie Zeilen mit einem Nullwert in R entfernt werden. In anderen Fällen kann ich mit na.omit() alle NA-Werte löschen oder mit complete.cases() Zeilen löschen, die NA-Werte enthalten.

Gibt es jemanden, der weiß, wie man Zeilen mit Nullwerten in R entfernt?

Zum Beispiel :

Vor

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

Nach dem

|    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

Es gibt verschiedene Möglichkeiten, dies zu tun. Ich bevorzuge apply, da es leicht erweiterbar ist:

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

Nun, Sie könnten Ihre 0s gegen NA austauschen und dann eine dieser Lösungen verwenden, aber der Unterschiedlichkeit halber könnte man feststellen, dass eine Zahl nur dann einen endlichen Logarithmus hat, wenn sie größer als 0 ist, sodass rowSums der log wird Sei nur endlich, wenn sich keine Nullen in einer Reihe befinden.

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

Ich würde wahrscheinlich mit Jorans Vorschlag gehen, 0 durch NA zu ersetzen und dann die von Ihnen erwähnten eingebauten Funktionen zu verwenden. Wenn Sie das nicht können/wollen, können Sie any() verwenden, um Zeilen zu finden, die 0 enthalten, und die Untergruppe dieser Zeilen zu ermitteln:

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

Um die Methode von Joran zu implementieren, sollten Sie auf diese Weise etwas anfangen:

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

Ich würde folgendes tun.

Setzen Sie die Null auf NA.

 data[data==0] <- NA
 data

Löschen Sie die mit NA verknüpften Zeilen.

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

Ich bevorzuge eine einfache Anpassung der Methode von csgillespie und verzichte auf die Definition einer Funktion:

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

wobei d Ihr Datenrahmen ist.

1
Robert Yi

Sie können einen Filter aus dem Dplyr-Paket verwenden.

Nennen wir Ihren Datenrahmen df 

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

df1 enthält nur Zeilen mit Einträgen über Null. Hoffe das hilft. 

1
Vinay B