2017-11-29 20 views
1

ようです技術的には依然として正確な出力ではあるが、ランク付け出力(Pos)はちょっと混乱して解釈が難しくなる。例えば計算は、グループごとにランクが、カウントネクタイは、このポストからフォローアップ1

Type X Pos 
a  50 0 
a  51 1 
a  52 2 
a  53 3 
a  54 4 
a  54 4 
a  54 4 
a  55 7 
a  56 8 
a  57 9 
a  57 9 
b  51 0 
b  51 0 
b  51 0 
b  52 3 
b  52 3 
b  56 5 
c  53 0 
c  57 1 
d  52 0 
d  52 0 
d  54 2 
d  58 3 
d  58 3 
d  70 5 

順位相対順位が(同じ値が同じランク付けされる、より低い値がより低いランク、およびより高い値は、より高いランクの)正しい、しかし:

library(plyr) 
df <- data.frame(type = c(rep("a",11), rep("b",6), rep("c",2), rep("d", 6)), 
        x = c(50:53, rep(54, 3), 55:56, rep(57, 2), rep(51,3), rep(52,2), 56, 
          53, 57, rep(52, 2), 54, rep(58, 2), 70)) 
df<-ddply(df,.(type),transform, pos=rank(x,ties.method="min")-1) 

を生成し私は出力をより美しく見せようとしています。何かご意見は?

私はこのようにして出力を取得したいのですが:

Type X Pos 
a  50 1 
a  51 2 
a  52 3 
a  53 4 
a  54 5 
a  54 5 
a  54 5 
a  55 6 
a  56 7 
a  57 8 
a  57 8 
b  51 1 
b  51 1 
b  51 1 
b  52 2 
b  52 2 
b  56 3 
c  53 1 
c  57 2 
d  52 1 
d  52 1 
d  54 2 
d  58 3 
d  58 3 
d  70 4 

このフォーマットはもちろん、各グループのレコードの合計数は問題ではありませんことを前提としています。 "-1"を取り除くことによって、0を取り除くことができますが、これは1つの側面のみを解決します。私は別の方程式とties.methodので遊んでみましたが、役に立たない。

おそらくrank()関数は私が使用するべきものではありませんか?

既にこれを認めている投稿がある場合は、私の方法で送ってください。たぶん私は何を検索するのかよくわからないかもしれませんが、私は間違いなく検索にいくつかのデューデリジェンスを行いました。

あなたのアイデアを事前におねがいします!また、これは私の最初の投稿ですので、基準、習慣、ベストプラクティスなどに関するフィードバックは高く評価されます。

答えて

0

それはあなたが密なランクを探しているようだ:dplyr

as.data.table(df)[, pos := frank(x, ties.method = 'dense'), by = 'type'][] 
#  type x pos 
# 1: a 50 1 
# 2: a 51 2 
# 3: a 52 3 
# 4: a 53 4 
# 5: a 54 5 
# 6: a 54 5 
# 7: a 54 5 
# 8: a 55 6 
# 9: a 56 7 
# 10: a 57 8 
# 11: a 57 8 
# 12: b 51 1 
# 13: b 51 1 
# 14: b 51 1 
# 15: b 52 2 
# 16: b 52 2 
# 17: b 56 3 
# 18: c 53 1 
# 19: c 57 2 
# 20: d 52 1 
# 21: d 52 1 
# 22: d 54 2 
# 23: d 58 3 
# 24: d 58 3 
# 25: d 70 4 
# type x pos 

dens_rank同じ事ない:

library(dplyr) 
df %>% group_by(type) %>% mutate(pos = dense_rank(x)) %>% ungroup() 
# # A tibble: 25 x 3 
#  type  x pos 
# <fctr> <dbl> <int> 
# 1  a 50  1 
# 2  a 51  2 
# 3  a 52  3 
# 4  a 53  4 
# 5  a 54  5 
# 6  a 54  5 
# 7  a 54  5 
# 8  a 55  6 
# 9  a 56  7 
# 10  a 57  8 
# # ... with 15 more rows 
+0

はご回答いただきありがとうございます。 'dplyr'で 'dense_rank'を使用するとうまくいき、困ったことに私の質問に簡単に解決できました。そして、 'data.table'パッケージをロードしたら、frank()ソリューションは完全に機能しました。 – MillionC

関連する問題