比较R中列表的相应元素

时间:2013-05-02 22:57:34

标签: r

以下是生成列表的代码:

    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

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

1 个答案:

答案 0 :(得分: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)替换为which(x == max(x))来获取所有这些内容。