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