2015-09-18 97 views
2

我想獲取每行中的前3個最大值併爲每個值進行座標。從矩陣返回前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] 

但是如何獲得相應的coo rdinate?

+0

您能否在此提供更多細節?我剛開始學習R.謝謝! – Lemon

回答

2

我們可以使用applyMARGIN=1來遍歷行。如果我們想要最小的值,我們可以簡單地使用order(如在OP的帖子中)並選擇前3個元素。 order給出了索引,它可以用來對元素進行子集創建'值'列。要創建座標,我們得到order以獲取列索引,複製行索引的行,將它們與sprintf一起粘貼。使用'值'和'座標'創建一個'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)