Как удалить строки с нулевым значением в R? - PullRequest
27 голосов
/ 02 апреля 2012

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

* После 1018 *

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

Ответы [ 6 ]

33 голосов
/ 02 апреля 2012

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

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

dfr[is.finite(rowSums(log(dfr[-1]))),]
6 голосов
/ 02 апреля 2012

Я бы, вероятно, согласился с предложением Джорана заменить 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

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

x[x==0] <- NA
4 голосов
/ 10 октября 2018

Вы можете использовать фильтр из пакета dplyr.

Давайте назовем ваш фрейм данных df

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

df1 будет иметь только строки с записями выше нуля. Надеюсь это поможет.

3 голосов
/ 14 мая 2018

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

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

 data[data==0] <- NA
 data

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

 data2<-data[complete.cases(data),]
1 голос
/ 20 декабря 2017

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

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

где d - ваш фрейм данных.

...