2012-04-02 387 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是你数据帧。