как возвращать индексы элементов матрицы для ее значений при сортировке в R

#r #sorting #matrix #indexing

Вопрос:

пусть моя мама будет:

       [,1]  [,2]  [,3]  [,4]
[1,]  9.39  7.32  2.92 11.17
[2,] 10.16 12.85  3.23 10.81
[3,]  8.56  5.21 12.62 11.05
 

который,

 set.seed(1000)
mymat <- matrix(round(runif(12, min=1, max=15),2), nrow = 3, ncol = 4, byrow = TRUE)
 

Я могу получить индекс максимальных и минимальных элементов mymat, используя arrayInd() . но что мне нужно, и я не знаю, как это сделать аккуратно, так это получить индекс строки ВСЕХ элементов матрицы от самого большого элемента до самого маленького. что-то вроде:

  2 2   #index for max element which is 12.85 here
 3 3   # index for next largest value
 1 4   # index for next largest value
 .
 .
 .
 

Ответ №1:

Мы могли melt matrix бы использовать формат into long data.frame , который по умолчанию возвращает индекс строки и столбца в виде первых двух столбцов и последнего столбца со значением «значение». Теперь проще arrange указать «значение» в desc конечном порядке и select только столбцы индекса

 library(reshape2)
library(dplyr)
melt(mymat) %>% 
    arrange(desc(value)) %>% 
    select(-value)
 

-выход

     Var1 Var2
1     2    2
2     3    3
3     1    4
4     3    4
5     2    4
6     2    1
7     1    1
8     3    1
9     1    2
10    3    2
11    2    3
12    1    3
 

Если матрица имеет dimnames атрибуты, то melt возвращает первые столбцы в качестве имен строк/столбцов. Но, если мы хотим удалить их, то установите значение dimnames NULL, например

 dimnames(mymat) <- list(paste0("r-", 1:3), paste0("c-", 1:4))
dimnames(mymat) <- NULL
 

или используя base R , создайте индекс элементов матрицы с order помощью , используйте для упорядочения индексов row и col

 i1 <- order(-mymat)
cbind(row(mymat)[i1], col(mymat)[i1])
   [,1] [,2]
 [1,]    2    2
 [2,]    3    3
 [3,]    1    4
 [4,]    3    4
 [5,]    2    4
 [6,]    2    1
 [7,]    1    1
 [8,]    3    1
 [9,]    1    2
[10,]    3    2
[11,]    2    3
[12,]    1    3
 

данные

 mymat <- structure(c(9.39, 10.16, 8.56, 7.32, 12.85, 5.21, 2.92, 3.23, 
12.62, 11.17, 10.81, 11.05), .Dim = 3:4)
 

Комментарии:

1. Я думаю, что решение melt() возвращает имя строки и столбца, а не индекс, верно? Я имею в виду, если бы у моей матрицы были имена строк :r-1, r-2,… и имена коллов : c-1, c-2,…, этот код возвращает r-2 c-2 . На самом деле это произошло, когда я попробовал его на такой матрице.

2. @Mathica Да, но я предположил, что у вас атрибуты dimnames равны НУЛЮ. Если у вас есть эти атрибуты, добавьте их в, NULL а затем используйте melt

3. @Mathica, но второе решение все еще работает, так как row/col индексы