首页 文章

如何在R中删除零值的行?

提问于
浏览
22

我有一个问题要解决如何在R中删除零值的行 . 在另一方面,我可以使用 na.omit() 删除所有NA值或使用 complete.cases() 删除包含NA值的行 .

有没有人知道如何在R中删除零值的行?

例如 :

Before

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

After

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

6 回答

  • 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,]
    
  • 1

    好吧,你可以将你的 0 换成 NA ,然后使用其中一个解决方案,但为了区别,你会注意到一个数字只有一个有限的对数,如果它大于 0 ,那么 rowSums 的如果一行中没有零, log 将只是有限的 .

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

    我可能会和Nora一起使用Joran 's suggestion of replacing 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
    
  • 4

    我更喜欢简单地改编csgillespie的方法,而不需要函数定义:

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

    其中 d 是您的数据框 .

  • 1

    我会做以下事情 .

    将零设置为NA .

    data[data==0] <- NA
     data
    

    删除与NA关联的行 .

    data2<-data[complete.cases(data),]
    
  • 1

    您可以使用dplyr包中的过滤器 .

    我们来调用您的数据框df

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

    df1只包含条目大于零的行 . 希望这可以帮助 .

相关问题