2012-04-02 394 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

一條路徑:通過用NAs替換零來減少您已經解決的問題。 – joran 2012-04-02 13:55:51

+0

謝謝Joran,爲您的答覆..但是,我不明白,用NAs替換零的意思是什麼?因爲在我拿到表格之前,我已經刪除了NAs值。但仍然有0的值。 你能告訴我該怎麼做嗎? – YougyZ 2012-04-02 14:01:23

+0

好吧,我想我必須用這個代碼來替換0與NAs .. 'data [which(data == 0)] = NA' – YougyZ 2012-04-02 14:04:04

回答

27

這樣做有幾個不同的方式。我更喜歡使用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,] 
4

嗯,你可以交換你0的爲NA,然後使用這些解決方案之一,但是對於差的緣故,你可以注意到,一些會如果它大於0,則只有有限的對數,因此logrowSums只有在連續不存在零時纔是有限的。

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

+1爲聰明,但我肯定會喜歡在實踐中的所有'/'任何'解決方案... – 2012-04-02 14:44:53

4

我可能會與喬蘭的建議,用NAs替換0,然後使用你提到的內置函數。如果你不能/不想這樣做,一個方法是使用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 
+0

謝謝反正,但我已經用csgillespie解決方案..;) – YougyZ 2012-04-02 14:26:18

0

我喜歡csgillespie的方法的簡單調整,前述函數定義的需要:

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

其中d是你數據幀。