私が持っているとしましょう
arr = 2 1 3
1 2 3
1 1 2
これを下に並べ替えるにはどうすればよいですか?
arr = 1 1 2
1 2 3
2 1 3
つまり、最初は列 1、次に列 2 などです。
あなたが求めている関数はorder
(どのようにして私がこの結論に達したか - 私の最初の考えは「まあ、並べ替えはどうですか?」でした。行単位ではなくベクトルとして並べ替えるように見えるものをsort
試しました。 「参照:複数の変数のソートまたは並べ替えについて」)。sort(arr)
arr
?sort
order
を見ると、 によって順序付けられ、によって同点が解消され、 によってさらに同点が解消されることが?order
わかります。これを行うには、 toの各列を渡すだけです。( の例のセクションに、この例もあります):order(x,y,z, ...)
x
y
z
arr
order
?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]]
のi
th 列のようなリストを作成する方法は他にもありますarr
が、これはその 1 つにすぎません。
これはうまくいきます:
arr[do.call(order, lapply(1:NCOL(arr), function(i) arr[, i])), ]
それがしていることは次のとおりです。
arr[order(arr[, 1], arr[, 2], arr[ , 3]), ]
ただし、マトリックス内の任意の数の列を許可します。
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,])
}