以下是生成列表的代码:
x = matrix(1, 4, 4)
x[2,2] = 5
x[2:3, 1] = 3
x
# [,1] [,2] [,3] [,4]
#[1,] 1 1 1 1
#[2,] 3 5 1 1
#[3,] 3 1 1 1
#[4,] 1 1 1 1
res = apply(x, 2, function(i) list(m=max(i), idx=which(i == max(i))))
res
#[[1]]
#[[1]]$m
#[1] 3
#
#[[1]]$idx
#[1] 2 3
#
#
#[[2]]
#[[2]]$m
#[1] 5
#
#[[2]]$idx
#[1] 2
#
#
#[[3]]
#[[3]]$m
#[1] 1
#
#[[3]]$idx
#[1] 1 2 3 4
#
#
#[[4]]
#[[4]]$m
#[1] 1
#
#[[4]]$idx
#[1] 1 2 3 4
现在我想比较每个子列表中的$ m,得到矩阵中的最大值及其索引,我可以这样做
mvector = vector('numeric', 4)
for (i in 1:4) {
mvector[i] = res[[i]]$m
}
mvector
#[1] 3 5 1 1
max_m = max(mvector)
max_m
#[1] 5
max_col = which(mvector == max_m)
max_row = res[[max_col]]$idx
max_row
#[1] 2
x[max_row, max_col]
#[1] 5
我想知道是否有更简单的方法可以做到这一点?
答案 0 :(得分:3)
您是否必须构建该列表?您可以直接处理矩阵x
:
最大值(您的max_m
):
max(x)
# [1] 5
在矩阵中找到此值(仅限第一个匹配):
which.max(x)
# [1] 5
或其行和列索引(您的max.row
和max.col
):
arrayInd(which.max(x), dim(x))
# [,1] [,2]
# [1,] 2 2
如果有多个最大值,您可以在上述两个语句中将which.max(x)
替换为which(x == max(x))
来获取所有这些内容。