假设我有以下数据框:
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