11

私が持っているとしましょう

arr = 2 1 3
      1 2 3
      1 1 2

これを下に並べ替えるにはどうすればよいですか?

arr = 1 1 2
      1 2 3
      2 1 3

つまり、最初は列 1、次に列 2 などです。

4

4 に答える 4

20

あなたが求めている関数はorder(どのようにして私がこの結論に達したか - 私の最初の考えは「まあ、並べ替えはどうですか?」でした。行単位ではなくベクトルとして並べ替えるように見えるものをsort試しました。 「参照:複数の変数のソートまたは並べ替えについて」)。sort(arr)arr?sortorder

を見ると、 によって順序付けられ、によって同点が解消され、 によってさらに同点が解消されることが?orderわかります。これを行うには、 toの各列を渡すだけです。( の例のセクションに、この例もあります):order(x,y,z, ...)xyzarrorder?order

order( arr[,1], arr[,2], arr[,3] ) 
# gives 3 2 1: row 3 first, then row 2, then row 1.
# Hence:
arr[ order( arr[,1], arr[,2], arr[,3] ), ]
#     [,1] [,2] [,3]
#[1,]    1    1    2
#[2,]    1    2    3
#[3,]    2    1    3

すごい!


しかし、arr[,i]ごとに書き出さなければならないのは少し面倒です。事前に列数がわからない場合はどうすればよいでしょうか。arr

例は、これを行う方法も示していますdo.call。基本的に、次のことを行います。

do.call( order, args )

どこにへの引数argsリストorderです。したがって、 の各列からリストを作成できる場合は、arrこれを として使用できますargs

これを行う 1 つの方法はarr、データ フレームに変換してからリストに変換することです。これにより、リストの要素ごとに 1 つの列が自動的に配置されます。

arr[ do.call( order, as.list(as.data.frame(arr)) ), ]

as.list(as.data.frame少しぎこちないです - 確かにlist[[i]]ith 列のようなリストを作成する方法は他にもありますarrが、これはその 1 つにすぎません。

于 2012-05-09T00:45:29.347 に答える
18

これはうまくいきます:

arr[do.call(order, lapply(1:NCOL(arr), function(i) arr[, i])), ]

それがしていることは次のとおりです。

arr[order(arr[, 1], arr[, 2], arr[ , 3]), ]

ただし、マトリックス内の任意の数の列を許可します。

于 2012-05-09T00:42:24.610 に答える
1

cols を使用して、並べ替える列とその順序を選択できるように、降順を行うこの小さな機能を作成しました

ord.mat = function(M, decr = F, cols = NULL){
    if(is.null(cols))
      cols = 1: ncol(M)
    out = do.call( "order", as.data.frame(M[,cols]))
    if (decr)
      out = rev(out)
    return(M[out,])
}
于 2013-08-01T21:41:33.220 に答える