2012-04-02 2 views
19

У меня есть проблема с решением, как удалить строки с нулевым значением в R. В других случаях я могу использовать na.omit() для удаления всех значений NA или использовать complete.cases() для удаления строк, содержащих значения NA.Как удалить строки с нулевым значением в R?

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

Один маршрут: уменьшите это до проблемы, которую вы уже решили, заменив нули на NA. – joran

+0

Спасибо, Джоран, за ваш ответ. Но, я не понимаю, что означать замену нулей на НС? Потому что, прежде чем я получу таблицу, я ранее удалял значения NA. Но есть еще 0 значений. Не могли бы вы рассказать мне, как это сделать? – YougyZ

+0

ОК, я думаю, я должен использовать этот код, чтобы заменить 0 на NAs. 'data [which (data == 0)] = NA' – YougyZ

ответ

27

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

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

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

+1 для умных, но я определенно предпочел бы решение 'all' /' any' на практике ... –

4

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

спасибо в любом случае, но я сделал это с решением csgillespie ..;) – YougyZ

0

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

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

где d это вы r.

Смежные вопросы