从矩阵返回前3个最小值及其索引

时间:2015-09-18 14:59:26

标签: r

我希望获得每行中前3个最大值并为每个值进行坐标。

假设我有以下矩阵:

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

取第一行: 我想要:

    value    coordinate
    2           [1,5]
    3           [1,2]
    4           [1,1]

目前,我能够通过以下方式获得每行中前3个最大值:

# example for first row    
    a <- m[1,]
    a
    ndx <- order(a)[1:3]
    a[ndx]

但是如何获得相应的坐标?

1 个答案:

答案 0 :(得分:2)

我们可以使用applyMARGIN=1来循环遍历行。如果我们想要最小的值,我们可以简单地使用order(如在OP的帖子中)并选择前3个元素。 order给出索引,它可用于对元素进行子集化以创建“值”列。要创建坐标,我们获取order以获取列索引,复制行索引的行,将它们与sprintf粘贴在一起。使用'value'和'coordinate'创建'data.frame'。

value <- c(apply(m, 1, function(x) x[order(x)[1:3]]))
coordinate <- sprintf('[%d,%d]', rep(1:nrow(m), each=3),
            c(apply(m, 1, function(x) order(x)[1:3])))
df1 <- data.frame(value, coordinate, stringsAsFactors=FALSE)
df1
#  value coordinate
#1     2      [1,5]
#2     3      [1,2]
#3     4      [1,1]
#4     1      [2,3]
#5     2      [2,2]
#6     3      [2,4]

如果我们想要最大的值,请在上面的代码中使用order(., decreasing=TRUE)