2

次のデータ フレームがあるとします。

df <- data.frame(store       = LETTERS[1:8],
                 sales       = c(  9, 128,  54,  66,  23, 132,  89,  70),
                 successRate = c(.80, .25, .54, .92, .85, .35, .54, .46))

に応じて店舗をランク付けしたいsuccessRateので、売上高の多い店舗を引き分けにしたいので、最初にこれを行います (視覚化を簡単にするため):

df <- df[order(-df$successRate, -df$sales), ]

ランキング変数を実際に作成するには、次のようにします。

df$rank <- ave(df$successRate, FUN = function(x) rank(-x, ties.method='first'))

したがって、df次のようになります。

  store sales successRate rank
4     D    66        0.92    1
5     E    23        0.85    2
1     A     9        0.80    3
7     G    89        0.54    4
3     C    54        0.54    5
8     H    70        0.46    6
6     F   132        0.35    7
2     B   128        0.25    8

問題は、小さな店をランキングに入れたくないということです。具体的には、売上50未満の店舗はランクインしないでほしいdf$rankしたがって、これは私が代わりに定義する方法です:

df$rank <- ifelse(df$sales < 50, NA,
                  ave(df$successRate, FUN = function(x) rank(-x, ties.method='first')))

問題は、これにより店舗 E と A が正しく削除されても、それらが占有していたランキングが再割り当てされないことです。df次のようになります。

  store sales successRate rank
4     D    66        0.92    1
5     E    23        0.85   NA
1     A     9        0.80   NA
7     G    89        0.54    4
3     C    54        0.54    5
8     H    70        0.46    6
6     F   132        0.35    7
2     B   128        0.25    8

の内側と外側の条件を試してみましたave()が、R に自分のやりたいことをさせることができません! このように店舗をランク付けするにはどうすればよいですか?

  store sales successRate rank
4     D    66        0.92    1
5     E    23        0.85   NA
1     A     9        0.80   NA
7     G    89        0.54    2
3     C    54        0.54    3
8     H    70        0.46    4
6     F   132        0.35    5
2     B   128        0.25    6
4

1 に答える 1

4

非常に簡単に行うことができますdata.table

library(data.table)
dt = data.table(df)

# do the ordering you like (note, could also use setkey to do this faster)
dt = dt[order(-successRate, -sales)]

dt[sales >= 50, rank := .I]
dt
#   store sales successRate rank
#1:     D    66        0.92    1
#2:     E    23        0.85   NA
#3:     A     9        0.80   NA
#4:     G    89        0.54    2
#5:     C    54        0.54    3
#6:     H    70        0.46    4
#7:     F   132        0.35    5
#8:     B   128        0.25    6

で実行する必要がある場合はdata.frame、希望する順序で次を実行します。

df$rank <- NA
df$rank[df$sales >= 50] <- seq_len(sum(df$sales >= 50))
于 2013-08-09T18:30:45.420 に答える