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

You*_*gyZ 28 r rows zero

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

有没有人知道如何在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     | 
Run Code Online (Sandbox Code Playgroud)

|    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    |  
Run Code Online (Sandbox Code Playgroud)

csg*_*pie 35

有几种不同的方法可以做到这一点.我喜欢使用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,]
Run Code Online (Sandbox Code Playgroud)


小智 8

我会做以下事情。

将零设置为 NA。

 data[data==0] <- NA
 data
Run Code Online (Sandbox Code Playgroud)

删除与 NA 关联的行。

 data2<-data[complete.cases(data),]
Run Code Online (Sandbox Code Playgroud)


Jam*_*mes 7

嗯,你可以交换你0的了NA,然后使用这些解决方案之一,但是对于差的缘故,你可以注意到,一些只会产生有限的对数,如果大于0,这样rowSumslog只会是有限的如果连续没有零.

dfr[is.finite(rowSums(log(dfr[-1]))),]
Run Code Online (Sandbox Code Playgroud)


Cha*_*ase 6

我可能会同意Joran的建议,即用NA替换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
Run Code Online (Sandbox Code Playgroud)

要实现Joran的方法,类似这样的方法可以帮助您入门:

x[x==0] <- NA
Run Code Online (Sandbox Code Playgroud)


Rob*_* Yi 5

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

d[apply(d!=0, 1, all),]
Run Code Online (Sandbox Code Playgroud)

d你的数据框在哪里。

  • 这对我不起作用,但这有效: d[!apply(d==0, 1, all),] (2认同)

小智 5

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

让我们称您的数据框为 df

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

df1 将只有条目大于零的行。希望这可以帮助。


Fen*_*Mai 5

使用 tidyverse/dplyr,您还可以删除变量子集中具有任何零值的行:

# variables starting with Mac must be non-zero
filter_at(df, vars(starts_with("Mac")), all_vars((.) != 0))

# variables x, y, and z must be non-zero
filter_at(df, vars(x, y, z), all_vars((.) != 0))

# all numeric variables must be non-zero
filter_if(df, is.numeric, all_vars((.) != 0))
Run Code Online (Sandbox Code Playgroud)