R: как вычислить поэлементную arg-min из списка матриц? - PullRequest
0 голосов
/ 27 мая 2018

Предположим, у меня есть список матриц.Предположим, далее я нашел наименьшие значения по столбцу. Вот мой последний вопрос

Мне действительно нужно знать, из какой матрицы выбрано каждое наименьшее значение.Моя оригинальная функция очень сложна.Поэтому я привел простой пример.У меня есть одна идея, и я действительно не знаю, как правильно реализовать ее в R.

Моя идея такова:

Предположим, что [i,j] - это элементы матрицы.Затем

if(d[[1]][i,j] < d[[2]][i,j]){
d[[1]][i,j] <– "x"
}else { d[[2]][i,j] <– "z"}

Итак, я хотел бы подписать название матрицы, которая соответствует каждому наименьшему значению.Затем сохраните имена в отдельной матрице.Итак, тогда я могу видеть значения в одной матрице и соответствующие им имена (откуда они берутся) в другой матрице

Например,

y <- c(3,2,4,5,6, 4,5,5,6,7)
x[lower.tri(x,diag=F)] <- y
> x
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    3    0    0    0    0
[3,]    2    6    0    0    0
[4,]    4    4    5    0    0
[5,]    5    5    6    7    0



k <- c(1,4,5,2,5,-4,4,4,4,5)
z[lower.tri(z,diag=F)] <- k
> z
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    1    0    0    0    0
[3,]    4    5    0    0    0
[4,]    5   -4    4    0    0
[5,]    2    4    4    5    0



 d <- list(z, x)

Тогда:

do.call(pmin, d) (answered by @akrun)

Тогда я получу только матрицу с наименьшими значениями.Я хотел бы знать, откуда берется каждое значение?

Любая идея или помощь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Или другой вариант - преобразовать его в 3D-массив и использовать apply с which.min

apply(array(unlist(d), c(5, 5, 2)), c(1, 2), which.min)

Или с pmap из purrr

library(purrr)
pmap_int(d, ~ which.min(c(...))) %>%
       array(., dim(x))
0 голосов
/ 27 мая 2018

Вы можете использовать Map и do.call для создания собственных функций, которые будут применяться поэлементно к списку входных данных, в вашем случае к списку матриц.

pwhich.min <- function(...) {
  which.min(c(...)) # which.min takes a single vector as input
}

di <- unlist(do.call(Map, c(list(f = pwhich.min), d)))
dim(di) <- dim(x) # take dimension from one of the inputs
di

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

РЕДАКТИРОВАТЬ:

Чтобы уточнить, вы можете сделать что-то вроде Map(f = min, z, x), чтобы применить min к каждой паре значений в z и x, хотя в этом случае min уже поддерживает произвольное количество входов черезмноготочие (...).

Напротив, which.min принимает только один вектор в качестве входных данных, поэтому вам нужна обертка с многоточием, которая объединяет все значения в вектор (pwhich.min выше).

Поскольку вам может потребоваться иметь более двух матриц, вы можете поместить их все в список и использовать do.call, чтобы поместить каждый элемент в списке в качестве параметра для функции, которую вы указали в f.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...