#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
индексы