2015-08-16 4 views
3

Я пытаюсь выработать способ подмножества матрицы, которая является чисто числовой (т. Е. Имена столбцов и строк). Чтобы поместить это в виде обработанного примера, я хотел бы удалить строки, которые не соответствуют логическому условию.Подстановка по условию строки в R

set.seed(42) 
m <- matrix(sample.int(100, 10*10, TRUE), 10, 10) 

Скажите, что я хочу сделать подмножество поэтому я держу строки, где максимальное значение строки составляет 90 или более, но падение тех, которые не удовлетворяют этому условию.

Единственный способ, которым я могу это сделать, - это цикл if/else (max(m[i,]) > 90), но я считаю, что должен быть более элегантный способ сделать это.

Любые идеи?

+0

Использования 'any' здесь есть еще одна опция' m [apply (m, 1, function (x) any (! x <90)),] ' –

ответ

4

Вы можете сделать это в несколько этапов.

Во-первых, найти максимумы строк, используя apply по рядам:

maxima = apply(m, 1, max) 
# [1] 92 99 99 98 93 96 98 91 98 84 

Далее, получить те, которые больше, чем ваш порог:

above = maxima >= 90 
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE 

Теперь используйте это подмножество вашей данные:

m[above, ] 

Или в одной строке:

m[apply(m, 1, max) >= 90, ] 

Вы можете условно разменить это условие. Например, чтобы проверить, является ли максимум между два значением, вы можете сделать это:

between = function (x, lower, upper) 
    x >= lower & x <= upper 

m[between(apply(m, 1, max), 90, 97), ] 
+0

Огромное спасибо за это. Я всегда изо всех сил старался добиться успеха. Если бы я хотел использовать два условия (например, больше 90 и меньше 97), чтобы иметь диапазон максимумов, как это соответствует функции приложения? – jordanawhite

+0

@jordanawhite См. Обновленный ответ (последний абзац).Примечательно, что он не зависит от вызова функции «apply»; то, что мы заменяем, является логикой сравнения ('.> = 90' против чего-то еще). –

+0

Блестящий, просто применил его к моим фактическим данным, и он отлично работает. Спасибо, ты очень помог! – jordanawhite

6

Вы можете просто создать логическую матрицу, используя m >= 90. Это возможно потому, что > является общей функцией с методом matrix (см. ?S4groupGeneric для других функций с аналогичным поведением). Тогда мы можем просто запустить rowSums над ним и проверить, что применяется условие, например

m[rowSums(m >= 90) > 0, ] 

Это означает, что если любое значение равно или больше, чем 90, конечно максимум выше слишком- так нет нужно искать максимум в первую очередь.


Альтернативного вариант заключается в использовании очень эффективный matrixStats пакета и его rowMaxs функции

library(matrixStats) 
m[rowMaxs(m) >= 90, ] 

В соответствии с вашими комментариями, здесь возможным решением векторизованного диапазоне

Maxima <- rowMaxs(m) 
m[Maxima >= 90 & Maxima <= 97, ] 
+2

@jordanawhite, хотя вы полностью проигнорировали этот ответ, см. Редактирование ваших комментариев. –

+0

Спасибо за это Дэвид. Я продолжил первый ответ, но спасибо за ваш ответ. Я посмотрю на пакет matrixStats, так как я уверен, что это будет полезно для другой работы, которую я делаю – jordanawhite

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