2013-11-14 1 views
0

У меня есть две матрицы:R: Создать список комбинаций имен строк и столбцов и ранжировать их

matrix1: 

    col1 col2 
row1 5  4 

row2 4  6 




matrix2: 

    col1 col2 
row1 48  50 

row2 47  46 

То, что я хочу, это новая матрица или таблица:

  Dim1 Dim2 rank 
row2col1 4  47  1 
row1col2 4  50  2 
row1col1 5  48  3 
row2col2 6  46  4 

Как вам могу видеть, я хочу ранжировать различные комбинации строк и столбцов сначала на основе dim1, и если есть связь, используя dim2. Матрицу результатов нужно сортировать с использованием этого ранга. Как я могу это достичь? Стоит отметить, что matrix1 и 2 содержат значения для dim1 и dim2 и имеют одинаковые имена столбцов и строк.

+1

Пожалуйста, создайте [воспроизводимый пример] (http://stackoverflow.com/a/5963610/1412059). – Roland

+0

@Roland Я добавил воспроизводимый пример – Bob

+2

@Bob нет, вы этого не сделали. – zx8754

ответ

4

Предполагая, что нет повторяющихся строк:

a <- array(c(5,4,4,6,48,47,50,46),c(2,2,2)) 
dimnames(a) <- list(c("row1", "row2"), c("col1", "col2"), c("m1", "m2")) 
# , , m1 
# 
# col1 col2 
# row1 5 4 
# row2 4 6 
# 
# , , m2 
# 
# col1 col2 
# row1 48 50 
# row2 47 46 

library(reshape2) 
b <- acast(melt(a), Var1+Var2~Var3) 
b <- b[order(b[,1], b[,2]),] 

Или для произвольного числа столбцов:

b <- b[do.call(order, lapply(seq_len(ncol(b)), function(i) b[,i])),] 
#add ranks 
b <- cbind(b, rank=seq_len(nrow(b))) 

#   m1 m2 rank 
# row2_col1 4 47 1 
# row1_col2 4 50 2 
# row1_col1 5 48 3 
# row2_col2 6 46 4 
+0

Как я могу сделать это динамически, используя имена розеток и столбцов? – Bob

+1

Не понимаю. – Roland

+0

, учитывая, что матрица имеет n строк и m столбцов. Ваш пример имеет жестко заданные значения. Извините, что я новичок в R :-) – Bob

2

взглянуть на ?order:

df <- data.frame(Dim1=c(6,5,4,4), Dim2=c(46,48,47,50)) 

o <- order(df$Dim1, df$Dim2) 

df[o, ] 
# Dim1 Dim2 
#3 4 47 
#4 4 50 
#2 5 48 
#1 6 46 

От ?order:

'order' возвращает перестановку, которая перестраивает свой первый аргумент в порядке возрастания или убывания, прерывая связи еще аргументов. ... В случае связей в первом векторе значения во втором - , используемые для разрыва связей. Если значения по-прежнему связаны, значение в поздних аргументы используются, чтобы разорвать связь

Смежные вопросы