Как удалить строки с нулевым значением в R?

у меня есть проблема решить, как удалить строки с нулевым значением в 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     | 

после

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

5 ответов


есть несколько различных способов сделать это. Я предпочитаю использовать 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,]

Ну, вы могли бы поменять свой 0на NA а затем используйте одно из этих решений, но ради разницы вы можете заметить, что число будет иметь конечный логарифм, только если оно больше 0, Так что rowSums на log будет конечным, только если в строке нет нулей.

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

Я бы, вероятно, пошел с предложением Джорана заменить 0 на NAs, а затем использовать встроенные функции, которые вы упомянули. Если вы не можете/не хотите этого делать, один из подходов-использовать 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

чтобы реализовать метод Джорана, что-то вроде этого должно заставить вас начать:

x[x==0] <- NA

Я предпочитаю простую адаптацию метода csgillespie, предшествующую необходимости определения функции:

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

здесь d ваш фрейм данных.


Я бы сделал следующее.

установите ноль в NA.

 data[data==0] <- NA
 data

удалить строки, связанные с NA.

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