2

下面是生成列表的代码:

    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

我想知道是否有更简单的方法可以做到这一点?

4

1 回答 1

3

你必须建立那个列表吗?您可以x直接处理矩阵:

最大值(你的max_m):

max(x)
# [1] 5

在矩阵中找到此值的位置(仅限第一个匹配项):

which.max(x)
# [1] 5

或其行和列索引(您的max.rowmax.col):

arrayInd(which.max(x), dim(x))
#      [,1] [,2]
# [1,]    2    2

如果有多个最大值,您可以通过替换上面两个语句中的which.max(x)with来获得所有最大值。which(x == max(x))

于 2013-05-02T23:09:53.503 回答