R:如何从矩阵列表中计算元素arg-min?

时间:2018-05-27 13:05:47

标签: r

假设我有一个矩阵列表。假设我进一步找到了列中最小的值。 Here is my last question

我真的需要知道从哪个矩阵中选择每个最小值。我原来的功能非常复杂。因此,我提供了一个简单的例子。我有一个想法,实际上不知道在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 :(得分:3)

您可以使用Mapdo.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应用于zx中的每对值, 虽然在这种情况下min已通过省略号(...)支持任意数量的输入。

相比之下, which.min只需要一个向量作为输入, 所以你需要一个带有省略号的包装器,它将所有值组合成一个向量 (pwhich.min以上)。

由于您可能希望有两个以上的矩阵, 你可以将它们全部列入清单, 并使用do.call将列表中的每个元素作为参数添加到f中指定的函数中。

答案 1 :(得分:1)

或另一种选择是将其转换为3D数组,并将applywhich.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))