2014-01-23 4 views
1

У меня есть симметричная матрица mat:R получают наивысшие ячейки x и их имена/имена в симметричной матрице?

A B C 
A 1 . . 
B . 1 . 
C . . 1 

И я хочу, чтобы вычислить два высших элементы. Теперь, так как это симметричная матрица Я думал использовать upper.tri так:

mat.tri<-upper.tri(mat) # convert to upper tri 
mat.ord<-order(mat.tri,na.last=TRUE,decreasing=TRUE)[1:2] # order by largest 
a.ind<-which(mat%in%mat.tri[mat.ord]) # get absolute indices 
r.ind<-arrayInd(a.ind,dim(mat)) # get relative indices 
# get row/colnames using these indices 

Так выше такой окольный способ делать вещи, и даже тогда выход имеет «дублирующие» строки в том, что они просто транспонировать. .

У кого-нибудь есть более интуитивный способ сделать это?

Спасибо.

ответ

1

Либерально заимствуя отличные идеи от @SimonO'Hanlon и @lukeA, вы можете построить двухстрочную функцию, чтобы делать то, что вы хотите. Я использую:

  • arrayInd() вернуть индекс массива
  • order() заказать верхние треугольные элементы
  • и дополнительный трюк установки нижней треугольной матрицы к NA, используя m[lower.tr(m)] <- NA

Try это:

whichArrayMax <- function(m, n=2){ 
    m[lower.tri(m)] <- NA 
    arrayInd(order(m, decreasing=TRUE)[seq(n)], .dim=dim(m)) 
} 

mat <- matrix(c(1,2,3,2,1,5,3,5,1) , 3 , byrow = TRUE) 
mat 

    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 2 1 5 
[3,] 3 5 1 

whichArrayMax(mat, 2) 
    [,1] [,2] 
[1,] 2 3 
[2,] 1 3 
+0

Oh +1 очень хорошо. Я слишком занят чтением, чтобы обновить свой ответ. Я просто удалю его. –

+0

Спасибо, что сделал трюк! –

0
arrayInd(which.max(mat), .dim=dim(mat)) 

который в основном так же, как which(mat == max(mat) , arr.ind = TRUE)[1,] от @ SimonO'Hanlon, но более эффективно.

+0

Спасибо, но как насчет t он max 'x' и их индексы (не включая дубликаты)? Я уже знаю, как получить элемент max с помощью 'which.max'. –

+0

В этом случае я бы попробовал sth как 'mat [lower.tri (mat, diag = TRUE)] <- NA; arrayInd (который (mat% in% sort (mat, уменьшение = TRUE) [1: 2]), .dim = dim (mat)) '(для x = 2) – lukeA