R - извлечь строки из матрицы, удовлетворяющие заданному условию?

       [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    1
[3,]    0    1    0
[4,]    0    0    1
[5,]    1    0    0

Учитывая матрицу, подобную приведенной выше, - каков эффективный способ перебора матрицы, выбирая строки, для которых первый элемент равен 1, а все остальные элементы равны 0, так что

       [,1] [,2] [,3]    
[1,]    1    0    0    
[2,]    1    0    0

возвращается?

Спасибо д.


person Darren J. Fitzpatrick    schedule 11.07.2011    source источник


Ответы (1)


Воссоздайте данные:

a <- array(c(1,0,0,0,1,0,1,1,0,0,0,1,0,1,0), dim=c(5,3))

Теперь создайте вектор, который соответствует условию.

cond <- c(1, 0, 0)

Затем оператор apply, заключенный в вызов which, сообщит вам, какие строки соответствуют вашему условию.

which(apply(a, 1, function(x)all(x==cond)))
1] 1 5

Наконец, чтобы извлечь строки, в которых выполняется это условие:

x <- which(apply(a, 1, function(x)all(x==cond)))
a[x, ]


     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    1    0    0

Результирующий массив не содержит много информации. Возможно, вы хотели узнать, сколько строк соответствует условию?

length(x)
[1] 2

Чтобы ответить на следующий вопрос. Как создать вектор состояния, когда массив большой?

Ну, один из способов заключается в следующем. Допустим, у вас есть массив из 100 столбцов в ширину, поэтому вам нужен вектор длиной 100, и вы хотите, чтобы третий элемент был равен 1:

cond <- rep(0, 100)
cond[3] <- 1
cond
  [1] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [38] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [75] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
person Andrie    schedule 11.07.2011
comment
Мне нравится это решение, но заранее определить условия проблематично. Можно ли изменить код, чтобы условие не создавалось заранее в виде вектора? Предположим, мне нужны все строки, где 2-й столбец == 1, а все остальные столбцы == 0, и, возможно, мне нужны строки, где 3-й столбец == 1 и т. д. Учитывая, что матрица большая (~ 1000x1000), невозможно создать все возможные условия. Спасибо д ;-) - person Darren J. Fitzpatrick; 11.07.2011