36

Rでゼロ値を持つ行を削除する方法を解決する問題があります。一方で、na.omit()すべての NA 値を削除するか、 NA 値complete.cases()を含む行を削除するために使用できます。

Rで値がゼロの行を削除する方法を知っている人はいますか?

例えば ​​:

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

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

12 に答える 12

47

これにはいくつかの方法があります。apply簡単に拡張できるので、私は を使用することを好みます。

##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,]
于 2012-04-02T14:01:15.440 に答える
8

私はおそらく、0をNAに置き換えてから、あなたが言及した組み込み関数を使用するというJoranの提案に同意するでしょう。それができない/したくない場合は、1 つの方法としてany()、0 を含む行を検索し、それらをサブセット化する方法があります。

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

Joran のメソッドを実装するには、次のようなものから始めます。

x[x==0] <- NA
于 2012-04-02T14:05:51.087 に答える
7

0の をに置き換えて、これらの解の 1 つを使用することもできますが、違いを確認するために、NA数値が より大きい場合0、その数値は有限の対数しか持たないことに注意してください。行にゼロがない場合。rowSumslog

dfr[is.finite(rowSums(log(dfr[-1]))),]
于 2012-04-02T14:01:37.050 に答える