Подтвердить что ты не робот

Как удалить строки с нулевым значением в 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    |  
4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

где d - ваш кадр данных.