Получить ранг матричных записей? - PullRequest
3 голосов
/ 30 сентября 2011

Предположим матрицу:

> a <- matrix(c(100, 90, 80, 20), 2, 2)
> a
     [,1] [,2]
[1,]  100   80
[2,]   90   20

Предположим, я хочу преобразовать элементы матрицы в ранги:

>rank.a <- rank(a)
> rank.a
[1] 4 3 2 1

Возвращает вектор, т. Е. Структура матрицы потеряна.Можно ли ранжировать матрицу так, чтобы выходные данные имели вид:

     [,1] [,2]
[1,]   4    2 
[2,]   3    1

Ответы [ 3 ]

6 голосов
/ 30 сентября 2011

Альтернативой ответу @ EDi является копирование a и последующее присвоение результата rank(a) непосредственно элементам копии a:

> a <- matrix(c(100, 90, 80, 20), 2, 2)
> rank.a <- a
> rank.a[] <- rank(a)
> rank.a
     [,1] [,2]
[1,]    4    2
[2,]    3    1

, что избавляет вас от перестройкиматрица путем опроса размеров входной матрицы.

Обратите внимание, что (как упоминает @Andrie в комментариях) копирование a требуется только в том случае, если требуется сохранить оригинал a.Главное, на что следует обратить внимание: поскольку a уже имеет соответствующие размеры, мы можем рассматривать его как вектор и заменять содержимое a вектором рангов a.

3 голосов
/ 30 сентября 2011

@ У Гэвина Симпсона очень красивое и элегантное решение!Но есть одна оговорка:

Тип матрицы останется прежним или будет расширен.В основном вы не заметите, но учтите следующее:

a <- matrix( sample(letters, 4), 2, 2)
rank.a <- a
rank.a[] <- rank(a)
typeof(rank.a) # character

Поскольку матрица была символом, с которого нужно начинать, значения rank (которые являются двойными) были преобразованы в строки символов!

Вот более безопасный способ, который просто копирует все атрибуты:

a <- matrix( sample(letters, 4), 2, 2)
rank.a <- rank(a)
attributes(rank.a) <- attributes(a)
typeof(rank.a) # double

Или, как однострочный, используя structure, чтобы скопировать только соответствующие атрибуты (но больше печатать):

a <- matrix( sample(letters, 4), 2, 2)
rank.a <- structure(rank(a), dim=dim(a), dimnames=dimnames(a))

Конечно, dimnames можно было бы опустить в данном конкретном случае.

3 голосов
/ 30 сентября 2011

почему бы не преобразовать вектор обратно в матрицу с размерами исходной матрицы?

> a <- matrix(c(100, 90, 80, 20, 10, 5), 2, 3)
> a
     [,1] [,2] [,3]
[1,]  100   80   10
[2,]   90   20    5
> rank(a)
[1] 6 5 4 3 2 1
> rmat <- matrix(rank(a), nrow = dim(a)[1], ncol = dim(a)[2])
> rmat
     [,1] [,2] [,3]
[1,]    6    4    2
[2,]    5    3    1
...