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