2013-04-29 34 views
1

我已经搜索了很多谷歌,并且在Stackoverflow中有许多有用的R代码解决方案。 我有两个矩阵,它们是索引矩阵和实数返回矩阵。 它们的尺寸是相同的(约500乘500矩阵?) 它们太大了,所以我用小得多的例子做练习。我该如何订购一个矩阵,保留原始数值(使用R)

> setwd("B:/FE/2013.4.28") 
> data <- read.csv("ex.csv") 
> data 
    a b c d e f g h  i 
1 7 5 2 1 11 4 5 55 22 
2 3 1 3 5 2 4 6 8 13 
3 90 99 999 9999 2 22 222 2223 10973 
4 8 4 988 1004 6 15 12 78 50 
> id <- t(apply(data,1,order)) 
> lapply(1:nrow(id),function(i)data[i,id[i,]]) 
[[1]] 
    d c f b g a e i h 
1 1 2 4 5 5 7 11 22 55 

[[2]] 
    b e a c f d g h i 
2 1 2 3 3 4 5 6 8 13 

[[3]] 
    e f a b g c h d  i 
3 2 22 90 99 222 999 2223 9999 10973 

[[4]] 
    b e a g f i h c d 
4 4 6 8 12 15 50 78 988 1004 

> matrix(names(data)[id],ncol=ncol(data)) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] "d" "c" "f" "b" "g" "a" "e" "i" "h" 
[2,] "b" "e" "a" "c" "f" "d" "g" "h" "i" 
[3,] "e" "f" "a" "b" "g" "c" "h" "d" "i" 
[4,] "b" "e" "a" "g" "f" "i" "h" "c" "d" 
> criteria <- matrix(names(data)[id],ncol=ncol(data)) 
> data2 <- read.csv("ex2.csv",header=TRUE) 
> data2 
     a  b  c  d  e  f  g  h   i 
1 1.100000 1.13000 0.900000 1.70000 1.54500 1.220000 2.000000 1.40000 1.9800000 
2 1.242300 1.64345 1.452500 2.20000 1.43240 0.234423 1.556234 1.32432 1.2342300 
3 1.542542 1.35432 1.342523 1.23432 1.43254 1.324320 1.546540 2.43200 0.4321432 
4 1.542354 1.65460 0.324130 0.65460 1.23452 1.654325 1.342134 0.34124 1.1000000 
> rr <- order(data2,criteria) 
> matrix(rr,ncol=ncol(criteria)) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 22 16 5 20 28 18 3 6 33 
[2,] 12 9 21 2 11 19 17 24 25 
[3,] 32 1 34 23 7 10 27 8 14 
[4,] 35 36 15 30 29 4 26 13 31 

这是我的代码。我已经将“ex”设置为索引矩阵,将ex2设置为实际返回矩阵。 我想重新排列'ex'逐行上升(每一行意味着一周内的索引(标准)数)

然后,我的明确目标是将'矩阵ex2'重新排序为'矩阵ex'

我已经在stackoverflow中复制并粘贴了lapply代码。所以我可以像这样重新排列'矩阵前'。

> matrix(names(data)[id],ncol=ncol(data)) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] "d" "c" "f" "b" "g" "a" "e" "i" "h" 
[2,] "b" "e" "a" "c" "f" "d" "g" "h" "i" 
[3,] "e" "f" "a" "b" "g" "c" "h" "d" "i" 
[4,] "b" "e" "a" "g" "f" "i" "h" "c" "d" 

> rr <- order(data2,criteria) 
> matrix(rr,ncol=ncol(criteria)) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 22 16 5 20 28 18 3 6 33 
[2,] 12 9 21 2 11 19 17 24 25 
[3,] 32 1 34 23 7 10 27 8 14 
[4,] 35 36 15 30 29 4 26 13 31 

数据是ex,data2是ex2。 d是第1行(= 1)中的最小数字的标题,h是第1行中的最大数字的标题(= 55) 因此,我已经成功地进行了排序升序,逐行。 ex被逐行重新排序。它由标题表示。我可以通过复制来完成此操作,并将代码粘贴到Stackoverflow上。

所以,我想使用ex的顺序重新排序ex2。 然后,我只能得到这个结果。函数'顺序'显示矩阵ex2中的第22个数在ex2中最小。

但是,我有两个问题。 第一个问题是“我想重新排序前ex2,逐行”。我的结果是按顺序排列的,但没有按行排序, 第二个问题是“我想知道ex2的数值,而不是排名”,我的结果显示了矩阵元素的排名。

我怎样才能得到有序的ex2作为ex的顺序,使用逐行方法?

我不擅长英语,对不起我的英语不好。 感谢您阅读我的问题!

+1

欢迎SO你好。你的问题有点混乱。显示出许多基质,并且很难遵循。也许可以考虑把你的问题编辑为更基本的东西:''我的矩阵1是,矩阵2是。我想用矩阵2排序矩阵1,以便结果看起来像矩阵3 “ – 2013-04-29 05:17:17

+0

另外,如果您按行排序,您能否定义如何确定两行之间的顺序? (即,哪一行先行,哪一行是第二行?如何知道?)。谢谢。 – 2013-04-29 05:19:12

回答

1

如果你想根据exorderex2行,

idx = t(apply(ex, 1, order)) 

t(sapply(1:nrow(idx), function(i) ex2[i,][idx[i,]]))