2013-09-18 6 views
1

У меня есть матрица (большая), и я хочу перебирать строки, и если эта строка имеет все 0s для каждого столбца со второго столбца до конца (35), тогда удалите эту строку. Это матрица из 0s и 1s для каждого события в строках и функции в столбцах.R Матрица удаляет строки из 0

for (i 1:nrow(myMatrix) { 
    keep = False 
    for (k 1:ncol(myMatrix) { 
     if (mymatrix[i,k] == 1) { 
      keep = True 
     } 
    if (keep == False) { 
     row.remove() 
    } 
} 

что-то вроде выше, ... ТНХ

+0

Петли ужасающе медленно R, по сравнению с векторизованных операций. В вашем случае указатель 'mat' с вектором TRUE/FALSE, определяющий, какие строки хранить и отбрасывать, как в решении Фрэнка, для получения более быстрого, короче и более читаемого кода. – Backlin

ответ

4

Попробуйте что-то вроде этого:

m[rowSums(m[,-1]) != 0,] 
+1

+1. На примере, который я дал, почти в 10 раз быстрее. – Frank

+0

Это сработало! за исключением того, что вышеприведенный оператор печатает на экране, и, очевидно, если вы хотите установить его на новую матрицу, нужно использовать: m_clean <- m [rowSums (m [, - 1])! = 0,] – StudentOfScience

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