1

Google でよく検索しましたが、Stackoverflow には便利な R コード ソリューションがたくさんありました。私は2つの行列を持っています。それらはインデックス行列と実数行列です。それらの寸法は同じです (約 500 x 500 マトリックス?)。

> 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」を行ごとに昇順で並べ替えたいと思いました(各行は1週間のインデックス(基準)番号を意味します)

次に、私の明確な目標は、「マトリックスex2」を「マトリックスex」として並べ替えることです

私はスタックオーバーフローにラップリーコードをコピーして貼り付けました。だから私はこのように「マトリックスex」を並べ替えることができました。

> 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

data は ex、data2 は ex2 でした。d は行 1 の最小数のヘッダー (=1)、h は行 1 の最大数のヘッダー (=55) であったため、ex を行ごとに昇順に並べることに成功しました。ex は行ごとに並べ替えられました。それはヘッダーによって提示されました。これは、コードをコピーして Stackoverflow に貼り付けることで実行できます。

というわけで、exの順番を使ってex2を並べ替えたいと思います。すると、この結果しか得られませんでした。関数 'order' は、行列 ex2 の 22 番目の数値が ex2 で最小であったことを示しています。

しかし、私には2つの問題があります。最初の問題は、「ex2 を行ごとに並べ替えたい」ということです。私の結果は並べられましたが、行ごとに並べられませんでした. 2番目の問題は、「ランクではなく、ex2の数値を知りたい」ということでした. 私の結果は、行列要素のランクを示していました.

行ごとの方法を使用して、exの順序として順序付けられたex2を取得するにはどうすればよいですか?

私は英語が苦手です。下手な英語で申し訳ありません。私の質問を読んでくれてありがとう!

4

1 に答える 1

1

orderの行ex2に従っての行にしたい場合はex

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

t(sapply(1:nrow(idx), function(i) ex2[i,][idx[i,]]))
于 2013-04-29T06:09:28.817 に答える