2016-12-19 27 views
0

複数の基準とties.methodを持つランク関数(または類似のもの)を使用する方法はありますか?R:2つの変数とties.method randomを持つランク関数

通常、ベクトルの値をランク付けするためにランクが使用され、タイがある場合は、「平均」、「ランダム」、「最初」など)のいずれかを使用できます。しかし、行列の列をランク付けするときには、複数の列を使用したいと考えています tiesメソッドの1つです。

最小限例:

x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
y <- c(1, 4, 5, 5, 2, 8 ,8, 1,3, 3) 
z <- c(0.2, 0.8, 0.5, 0.4, 0.2, 0.1, 0.1, 0.7, 0.3, 0.3) 
m <- cbind(x=x,y=y, z=z) 

私は上記のマトリックスにy - 値をランク付けしたい想像してみてください。しかし、結びついている場合は、機能にzの値を見てほしい。それ以降の結び付きがある場合は、ties.method = "random"のパラメータを使用します。

 x y z 
[1,] 1 1 0.2 
[2,] 8 1 0.7 
[3,] 5 2 0.2 
[4,] 9 3 0.3 
[5,] 10 3 0.3 
[6,] 2 4 0.8 
[7,] 4 5 0.4 
[8,] 3 5 0.5 
[9,] 6 8 0.1 
[10,] 7 8 0.1 

しかし、それはまた、このかもしれない:すなわち

は、可能な結果があり得る第四及び第五行はちょうど第として(異なる方法

 x y z 
[1,] 1 1 0.2 
[2,] 8 1 0.7 
[3,] 5 2 0.2 
[4,] 10 3 0.3 
[5,] 9 3 0.3 
[6,] 2 4 0.8 
[7,] 4 5 0.4 
[8,] 3 5 0.5 
[9,] 7 8 0.1 
[10,] 6 8 0.1 

お知らせ第10回)。上記の結果はorder -function(つまりm[order(m[,2], m[,3], sample(length(x))),]ですが、ソートされた行列のインデックスではなく、ランク値を受け取ることを希望しています)

なぜ私がランク値を必要とする、お気軽に、私は余分な詳細と質問を編集します今の私は、最小限の例がそうなると思う

EDIT:。。。@alistaireが指摘したように行列に変更されたデータフレーム

+1

明確にするために、 'cbind'は、data.frameではなく行列を作成します。 data.frameが必要な場合は、 'data.frame'を使います。 – alistaire

+0

@alistaire、あなたは正しいです、明確化のためにありがとう! –

答えて

2

order(order(x))は(Why does order(order(x)) equal rank(x) in R?を参照)rank(x)と同じ結果になりますので、あなただけのランク値を取得するために

order(order(y, z, runif(length(y)))) 

を行うことができます。


ここには、ties.methodのメソッドを使用できるようにするより複雑な方法があります。 dplyr

library(dplyr) 
rank2 <- function(df, key1, key2, ties.method) { 
    average <- function(x) mean(x) 
    random <- function(x) sample(x, length(x)) 
    df$r <- order(order(df[[key1]], df[[key2]])) 
    group_by_(df, key1, key2) %>% mutate(rr = get(ties.method)(r)) 
} 

rank2(df, "y", "z", "average") 
# Source: local data frame [10 x 5] 
# Groups: y, z [8] 
#  x  y  z  r rr 
# <dbl> <dbl> <dbl> <int> <dbl> 
# 1  1  1 0.2  1 1.0 
# 2  2  4 0.8  6 6.0 
# 3  3  5 0.5  8 8.0 
# 4  4  5 0.4  7 7.0 
# 5  5  2 0.2  3 3.0 
# 6  6  8 0.1  9 9.5 
# 7  7  8 0.1 10 9.5 
# 8  8  1 0.7  2 2.0 
# 9  9  3 0.3  4 4.5 
# 10 10  3 0.3  5 4.5 
+0

これは、結びついた場合にどうなるでしょうか? – G5W

+0

私はあなたの答えの最初の部分を使用して終了しました。また、 'sample(length(y))'の代わりに 'runif(length(y))'でうまくいくように見えました。 2番目の部分( 'dplyr'と一緒に)はおそらく後の段階で役に立つでしょう。ありがとう! –

1

ご迷惑をおかけして申し訳ございませんが、ご迷惑をおかけして申し訳ございませんが、ご迷惑をおかけ致します。フレームだけでなく、行列です。

x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
y <- c(1, 4, 5, 5, 2, 8 ,8, 1,3, 3) 
z <- c(0.2, 0.8, 0.5, 0.4, 0.2, 0.1, 0.1, 0.7, 0.3, 0.3) 
df <- data.frame(x=x,y=y, z=z) 

TM = "last"  ## Your desired ties method here. 
df[rank(df$z, ties.method=TM),] = df 
df = df[order(df$y),] 
df 
    x y z 
4 1 1 0.2 
9 8 1 0.7 
3 5 2 0.2 
5 10 3 0.3 
6 9 3 0.3 
10 2 4 0.8 
7 4 5 0.4 
8 3 5 0.5 
1 7 8 0.1 
2 6 8 0.1 

あなたはランクで利用可能なネクタイのいずれかの方法を使用することができますが、私はそれはそれは順序スイッチを作ったことを強調したように、ここでの「最後」を使用することにしました。

関連する問題