Использование 'which' с матрицами в R - условие is.element () ' - PullRequest
0 голосов
/ 22 января 2019

Как использовать функцию which() в матрице, чтобы она возвращала координаты матрицы, для которой условие TRUE, с условием, в котором используется оператор %in%?

ОбычноЯ бы просто использовал аргумент arr.ind функции which().

mat <- matrix(nrow = 10, ncol = 10, data = 0)
mat[5,3] <- 7
which(mat==7, arr.ind = T)

Это возвращает строку и столбец каждого элемента в mat, который проверяет условие.

Однако, если условие не использует ==, но %in%, это, похоже, не работает.

mat[4,7] <- 3
which(mat%in%c(3,7),arr.ind = T)

То же самое, используя is.element:

which(is.element(mat,c(3,7)),T)

Как я могу получитьстроки и столбцы матрицы, которые проверяют условие %in%?

1 Ответ

0 голосов
/ 22 января 2019

Как @akrun упомянул в своем комментарии, вы можете запустить sapply() через набор входных данных для проверки. Также будет работать другой метод, который поможет объяснить, почему %in% не работает так же, как ==:

Когда вы используете == для проверки отдельного значения, R возвращает матричный объект, однако при использовании %in% R возвращает вектор логических значений (ИСТИНА и ЛОЖЬ)

> class(mat == 3)
[1] "matrix"

> class(mat %in% 3)
[1] "logical"

Так что arr.ind=T ведет себя по-разному, потому что работает с двумя разными типами данных. Если вы хотели бы иметь ту же форму, что и у опции arr.ind=T, но с %in%, то вы можете преобразовать свой логический вектор обратно в матрицу, используя количество строк и столбцов из исходной матрицы:

> which(matrix(mat%in%c(3,7), nrow=nrow(mat), ncol = ncol(mat)), arr.ind=TRUE)

     row col
[1,]   5   3
[2,]   4   7

Это также сохраняет те же метки, что и ваш == пример.

...