假设我有一个矩阵列表。假设我进一步找到了列中最小的值。 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)
然后,我将只获得具有最小值的矩阵。我想知道每个值来自哪里?
请问有什么想法或帮助吗?
答案 0 :(得分:3)
您可以使用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
中指定的函数中。
答案 1 :(得分:1)
或另一种选择是将其转换为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))