2013-11-14 63 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

如何使用rownames和列名稱動態地執行此操作? – 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'返回一個排列,它將其第一個參數 重新排列爲升序或降序,並通過進一步的 參數來打破關係。 ... 在第一個向量中的關係的情況下,第二個值中的值是 用於打破關係。如果值仍然並列,值 後來參數用於打破平局