好的,请查看此数据框......
customer_name order_dates order_values
1 John 2010-11-01 15
2 Bob 2008-03-25 12
3 Alex 2009-11-15 5
4 John 2012-08-06 15
5 John 2015-05-07 20
假设我想添加一个订单变量,按名称,按最大订单日期排序最高订单值,使用最后的订单断路器订单日期。因此,最终数据应如下所示:
customer_name order_dates order_values ranked_order_values_by_max_value_date
1 John 2010-11-01 15 3
2 Bob 2008-03-25 12 1
3 Alex 2009-11-15 5 1
4 John 2012-08-06 15 2
5 John 2015-05-07 20 1
每个人的单个订单获得1,并且所有后续订单都根据该值排序,并且决胜者是获得优先权的最后订单日期。 在此示例中,John的8/6/2012订单获得了#2排名,因为它是在2010年11月1日之后放置的。 2015年5月7日的订单是1,因为它是最大的。因此,即使该订单是在20年前发布的,也应该是#1 Rank,因为它是John的最高订单价值。
有谁知道如何在R中做到这一点?我可以在数据框中的一组指定变量中排名吗?
感谢您的帮助!
答案 0 :(得分:16)
评分最高的答案(由cdeterman提供)实际上是不正确的。 order函数提供第1,第2,第3等排名值的位置,而不是当前顺序中值的排名。
让我们举一个简单的例子,我们想要排名,从最大的客户名称分组开始。我已经包含了手动排名,因此我们可以检查值
> df
customer_name order_values manual_rank
1 John 2 5
2 John 5 2
3 John 9 1
4 John 1 6
5 John 4 3
6 John 3 4
7 Lucy 4 4
8 Lucy 9 1
9 Lucy 6 3
10 Lucy 2 6
11 Lucy 8 2
12 Lucy 3 5
如果我运行cdeterman建议的代码,我会得到以下错误的等级:
> df %>%
+ group_by(customer_name) %>%
+ mutate(my_ranks = order(order_values, decreasing=TRUE))
Source: local data frame [12 x 4]
Groups: customer_name [2]
customer_name order_values manual_rank my_ranks
<fctr> <dbl> <dbl> <int>
1 John 2 5 3
2 John 5 2 2
3 John 9 1 5
4 John 1 6 6
5 John 4 3 1
6 John 3 4 4
7 Lucy 4 4 2
8 Lucy 9 1 5
9 Lucy 6 3 3
10 Lucy 2 6 1
11 Lucy 8 2 6
12 Lucy 3 5 4
订单用于将数据帧重新排序为递减或递增顺序。我们真正想要的是运行两次订单功能,二阶函数给我们想要的实际排名。
> df %>%
+ group_by(customer_name) %>%
+ mutate(good_ranks = order(order(order_values, decreasing=TRUE)))
Source: local data frame [12 x 4]
Groups: customer_name [2]
customer_name order_values manual_rank good_ranks
<fctr> <dbl> <dbl> <int>
1 John 2 5 5
2 John 5 2 2
3 John 9 1 1
4 John 1 6 6
5 John 4 3 3
6 John 3 4 4
7 Lucy 4 4 4
8 Lucy 9 1 1
9 Lucy 6 3 3
10 Lucy 2 6 6
11 Lucy 8 2 2
12 Lucy 3 5 5
答案 1 :(得分:10)
您可以使用dplyr
library(dplyr)
df %>%
group_by(customer_name) %>%
mutate(my_ranks = order(order(order_values, order_dates, decreasing=TRUE)))
Source: local data frame [5 x 4]
Groups: customer_name
customer_name order_dates order_values my_ranks
1 John 2010-11-01 15 3
2 Bob 2008-03-25 12 1
3 Alex 2009-11-15 5 1
4 John 2012-08-06 15 2
5 John 2015-05-07 20 1
答案 2 :(得分:2)
在基础R
中,您可以使用稍微笨拙的
transform(df,rank=ave(1:nrow(df),customer_name,
FUN=function(x) order(order_values[x],order_dates[x],decreasing=TRUE)))
customer_name order_dates order_values rank 1 John 2010-11-01 15 3 2 Bob 2008-03-25 12 1 3 Alex 2009-11-15 5 1 4 John 2012-08-06 15 2 5 John 2015-05-07 20 1
其中为order
提供了每个组的主要值和决胜局值。
答案 3 :(得分:1)
这可以通过ave
和rank
来实现。 ave
将适当的群组传递给rank
。 rank
的结果因请求的订单而被撤销:
with(x, ave(as.numeric(order_dates), customer_name, FUN=function(x) rev(rank(x))))
## [1] 3 1 1 2 1
答案 4 :(得分:0)
df%>%group_by(客户名称)%>%排列(customer_name,desc(order_values))%>%mutate(rank2 = rank(order_values))
答案 5 :(得分:0)
类似于@t-himmel 的回答,您可以使用 data.table 获得排名。
dt[ , rnk := order(order(order_values, decreasing = TRUE)), customer_name ]