r - 从列表中查找每行的最小值及其对应的列号
问题描述
一个可重现的例子:
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
我正在寻找适用于比提供的示例大得多的列表的通用解决方案。
解决方案
您可以使用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
如果要将其应用于多个此类列表,则可以将代码放入函数中。
推荐阅读
- sql - 如果节点/分区发生故障,Spark 如何确保数据一致性?
- javascript - Javascript 编码 HTML 的 URL
- image - 从api获取图像以及如何在flutter中设置每个图像的动态高度?
- java - 为什么当我在我的应用程序中按下任何按钮时没有音频播放?
- r - 如何使用与相对丰度图相对应的颜色标签制作复合图例?
- javascript - 在没有 USB 和 Expo 的 iPhone 上执行 react-native 调试代码
- python - 避免 NumericProperty 的绑定递归
- sql - 如何从站点的 sql 数据库中删除病毒?
- xpath - 如何使用 xpath 获取 youtube 标题
- java - 每次循环确定一个新点(带坐标),停在起点