2016-05-05 4 views
5

Я хотел бы заказать и trasform значения матрицы от самых больших до наименьшего значения, как в этой простой и воспроизводимой например:Getting матрица упорядоченный

#From : 
d<- c(-2,-34,25,0,13,0,25,-2,1) 
m<- matrix(d,3,3) 
m 
    [,1] [,2] [,3] 
[1,] -2 0 25 
[2,] -34 13 -2 
[3,] 25 0 1 

# To: 
m1 
    [,1] [,2] [,3] 
[1,] 5 4 1 
[2,] 6 2 5 
[3,] 1 4 3 

#25: biggest number therefore -->(1) 
#13: second biggest one ---> (2) 
# ecc ... 
#-34: the smallest one ---> (6) 

Любая помощь? Благодаря

ответ

2

Мы можем использовать dense_rank

library(dplyr) 
m1 <- m 
m1[] <- dense_rank(-m) 
m1 
# [,1] [,2] [,3] 
#[1,] 5 4 1 
#[2,] 6 2 5 
#[3,] 1 4 3 
+0

нет такой вещи, как бесплатный обед! Дисковое пространство - это то, что нужно иметь в виду (хотя и вообще незначительное), особенно учитывая все зависимости 'dplyr' – MichaelChirico

+0

Решение является компактным, но я понимаю, что смещение в голосовании. Итак, в вашем решении вы также указали «data.table». Не имеет ли эта проблема зависимости? – akrun

10

Вы можете преобразовать д фактор, а затем избавиться от уровней. (Это означает, что вам не нужны никакие дополнительные пакеты.)

m1 <- m 
m1[]<-unclass(factor(d, levels = sort(unique(d), decreasing=TRUE))) 
# alternative solutions from comments 
# or levels=sort(-d), thanks, akrun 
# or, to make it shorter: m1[] <- unclass(factor(-d)) 
# or, [eddi's suggestion using implicit conversions]: m1[] <- factor(-m) 
m1 
#  [,1] [,2] [,3] 
# [1,] 5 4 1 
# [2,] 6 2 5 
# [3,] 1 4 3 
+2

не просто 'm [] <- as.numeric (factor (m * -1))' work? очень умный – rawr

+3

У akrun был хороший ответ, используя 'dplyr :: dense_rank', который он, к сожалению, удалил. Я думаю, что философия R состоит в том, что есть много способов получить (почти) любой ответ, поэтому базовые R и dplyr или любые решения должны быть одинаково приветствуемыми. (Мое уведомление о необходимости дополнительных пакетов не предназначалось для того, чтобы сказать, что его решение плохое в любом смысле.) – lebatsnok

+2

'm1 [] <- unclass (factor (-d))' также сделает это :) 'unclass' is предпочитается над 'as.numeric' в соответствии с инструкциями R, потому что коэффициенты уже являются числовыми. 'unclass' удаляет дополнительные атрибуты (класс и уровни), которые делают фактор фактором. – lebatsnok

6

Подход с baserank:

#get unique values, since rank itself doesn't 
# seem to have an option that allows the 
# ranking system you have in mind 
u_m = unique(c(m)) 

#"merge" with match 
matrix(rank(-u_m)[match(m, u_m)], nrow = 3L, ncol = 3L) 
#  [,1] [,2] [,3] 
# [1,] 5 4 1 
# [2,] 6 2 5 
# [3,] 1 4 3 

base::rank Пока не есть способ получить то, что вы хотите прямо сейчас, мы можно использовать frank (как отмечено @eddi), улучшенный и эффективный вариант rank в data.table пакете, например, так:

library(data.table) 
matrix(frank(-m, ties.method = "dense"), nrow = 3L, ncol = 3L) 

Или, если матрица часть выглядит некрасиво, просто предварительно выделить что-то в качестве матрицы, а-ля

m1 = m 
m1[] = frank(-m, ties.method = "dense") 
Смежные вопросы