[英]R: Create a list of combinations of row names and column names and rank them
我有兩個矩陣:
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的值,並且具有完全相同的列名和行名。
假設沒有重復的行:
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
看一下?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”返回一個排列,該排列將其第一個參數重新排列為升序或降序,並通過其他參數打破聯系。 ...如果是第一個向量中的平局,則使用第二個向量中的值來打破平局。 如果這些值仍然是平局,則后面的參數中的值將用於打破平局
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.