首页 > 解决方案 > 从列表中查找每行的最小值及其对应的列号

问题描述

一个可重现的例子:

mat1 <- matrix(c(1,2,4,2,4,2,4,6,5,7,8,3), nrow = 3, ncol = 4, byrow = T)
mat2 <- matrix(c(2,1,7,8,2,6), nrow = 3, ncol = 2, byrow = T)
mat3 <- matrix(c(3,2,3,5,7,5,4,5,6,4,2,3,4,5,2), nrow = 3, ncol = 5, byrow = T)

list.mat <- list(mat1,mat2,mat3)

> list.mat

[[1]]
     [,1] [,2] [,3] [,4]
[1,]    1    2    4    2
[2,]    4    2    4    6
[3,]    5    7    8    3

[[2]]
     [,1] [,2]
[1,]    2    1
[2,]    7    8
[3,]    2    6

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

目标 1:找到每个元素的每一行的最小值。预期输出 [[1]]-> 1,2,3 [[2]]-> 1,7,2 [[3]]-> 2,4,2

目标 2:找到相应的列号。预期输出 [[1]]-> 1,2,4 [[2]]-> 2,1,1 [[3]]-> 2,2,1

***请注意,在 [[3]][3,] 中有两个最小数字,一个在第 1 列,另一个在第 5 列。在这种情况下,只报告最先出现的列。

目标 3:分别为每个列表找到目标 1 中的输出总和。预期结果 [[1]]-> 6 [[2]]-> 10 [[3]]-> 8

我正在寻找适用于比提供的示例大得多的列表的通用解决方案。

标签: rlistmatrixconditional-statementsapply

解决方案


您可以使用lapply

output1 <- lapply(list.mat, function(x) apply(x, 1, min))
output1

#[[1]]
#[1] 1 2 3

#[[2]]
#[1] 1 7 2

#[[3]]
#[1] 2 4 2

output2 <- lapply(list.mat, function(x) apply(x, 1, which.min))
output2

#[[1]]
#[1] 1 2 4

#[[2]]
#[1] 2 1 1

#[[3]]
#[1] 2 2 1

output3 <- lapply(output1, sum)
output3

#[[1]]
#[1] 6

#[[2]]
#[1] 10

#[[3]]
#[1] 8

如果要将其应用于多个此类列表,则可以将代码放入函数中。


推荐阅读