вернуться к позиции в матрице - PullRequest
2 голосов
/ 29 сентября 2019

comN<-gtools::permutations(2,5,v=c(0,1),repeats=TRUE)

which(comN==c(0,0,0,0,1),arr.ind.col=T)

но это не дало мне номер строки 2

Я хочу знать c (0,0,0,0,1) находится на позиции comN [2,]

Ответы [ 2 ]

1 голос
/ 29 сентября 2019
Матричные операции

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 раза быстрее.

0 голосов
/ 30 сентября 2019

Мы можем использовать sweep для сравнения построчных значений comN с вектором и использовать rowSums для подсчета числа TRUE в каждой строке

which(rowSums(sweep(comN, 2, c(0,0,0,0,1), `==`)) == ncol(comN))
#[1] 2

вместо rowSums мы также можем использовать apply, поскольку sweep уже возвращает матрицу логических векторов

which(apply(sweep(comN, 2,c(0,0,0,0,1), `==`), 1, all))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...