2012-04-02 28 views
19

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

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

1つのルート:これをゼロに置き換えることで既に解決している問題に減らしてください。 – joran

+0

あなたの返事のために、ジョラン、ありがとう。しかし、私は理解していない、ゼロをNAsで置き換えるのはどういう意味ですか?以前はテーブルを取得する前にNAs値を削除していました。しかし、まだ0の値があります。 どうすればいいですか? – YougyZ

+0

私は0をNAsに置き換えるのにこのコードを使わなければならないと思います。 'data [which(data == 0)] = NA' – YougyZ

答えて

27

後にこれを行うためのいくつかの異なる方法があります。さて、あなたはNAのためにあなたの0年代を交換して、これらのソリューションのいずれかを使用することができ

##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,] 
4

、その差のために、あなたは数がすることに気づくことができます:それは簡単に拡張ですので、私は、applyを使用して好みます0より大きい場合にのみ有限の対数しか持たないので、logrowSumsは、行内にゼロがない場合にのみ有限である。

+1

+1は巧妙ですが、実際には 'all' /' any'解決策を好むでしょう... –

4

私はおそらく、0をNAsに置き換えて、あなたが言及した組み込み関数を使用するというJoranの提案に行くでしょう。あなたは/ことを行うにはしたくないことができない場合は、1つのアプローチは、0を含む行を検索し、それらのうちサブセット化any()を使用することです:Joranのメソッドを実装するには

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 

を、このようなものは、あなたが始める必要があります:

x[x==0] <- NA 
+0

とにかく感謝していますが、私はcsgillespieソリューションでやっています。 – YougyZ

0

私は関数定義の必要性を前述の、csgillespieの方法の簡単な適応を好む:

dはあなたです
d[apply(d!=0, 1, all),] 

rデータフレーム。

関連する問題