Матричные операции
R расположены в порядке столбцов, поэтому сравнение в вашей инструкции which
сравнивает вектор c(0,0,0,0,1)
столбец за столбцом, перерабатывая его. Просто посмотрите, что происходит в этом простом примере.
m <- matrix(1:8, ncol = 2)
m
# [,1] [,2]
#[1,] 1 5
#[2,] 2 6
#[3,] 3 7
#[4,] 4 8
m == c(1, 5)
# [,1] [,2]
#[1,] TRUE FALSE
#[2,] FALSE FALSE
#[3,] FALSE FALSE
#[4,] FALSE FALSE
Вектор c(1, 5)
не сравнивается с первой строкой, сравнения:
c(1, 2) == c(1, 5)
, затем c(1, 5)
перерабатывается ипо сравнению со следующими значениями в первом столбце. Поэтому, когда он достигает второго столбца, первое сравнение в этом столбце будет
c(5, 6) == c(1, 5)
#[1] FALSE FALSE
, возвращая c(FALSE, FALSE)
.
Вот почему мне понадобилась транспонированная t()
в моих решениях ниже. Это может быть
which(colSums(t(comN) == c(0,0,0,0,1)) == ncol(comN))
#[1] 2
или
which(apply(t(comN) == c(0,0,0,0,1), 2, all))
Решение colSums
примерно в 3 раза быстрее.