你可以使用以下基本语法在dplyr中按组对变量进行排序。
df %>% arrange(group_var, numeric_var) %>%
group_by(group_var) %>%
mutate(rank = rank(numeric_var))
下面的例子展示了如何在以下数据框架中实际使用这种语法。
#create data frame
df <- data.frame(team = c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'),
points = c(12, 28, 19, 22, 32, 45, 22, 28, 13, 19),
rebounds = c(5, 7, 7, 12, 11, 4, 10, 7, 8, 8))
#view data frame
df
team points rebounds
1 A 12 5
2 A 28 7
3 A 19 7
4 A 22 12
5 B 32 11
6 B 45 4
7 B 22 10
8 C 28 7
9 C 13 8
10 C 19 8
例1:按升序排列
下面的代码显示了如何将球员的得分按升序排列,按球队分组。
library(dplyr)
#rank points scored, grouped by team
df %>% arrange(team, points) %>%
group_by(team) %>%
mutate(rank = rank(points))
# A tibble: 10 x 4
# Groups: team [3]
team points rebounds rank
1 A 12 5 1
2 A 19 7 2
3 A 22 12 3
4 A 28 7 4
5 B 22 10 1
6 B 32 11 2
7 B 45 4 3
8 C 13 8 1
9 C 19 8 2
10 C 28 7 3
例2:降序排名
我们也可以在**rank()**函数中使用负号,按组对得分进行降序排列。
library(dplyr)
#rank points scored in reverse, grouped by team
df %>% arrange(team, points) %>%
group_by(team) %>%
mutate(rank = rank(-points))
# A tibble: 10 x 4
# Groups: team [3]
team points rebounds rank
1 A 12 5 4
2 A 19 7 3
3 A 22 12 2
4 A 28 7 1
5 B 22 10 3
6 B 32 11 2
7 B 45 4 1
8 C 13 8 3
9 C 19 8 2
10 C 28 7 1
如何处理排名中的平局
我们可以使用ties.method参数来指定我们在对数值进行排名时应该如何处理平局。
rank(points, ties.method='average')
你可以使用以下选项之一来指定如何处理平局。
- average: (默认) 给每个并列的元素分配平均等级(排在第3和第4位的元素都会得到3.5的等级)
- 第一:将第一个并列的元素分配到最低等级(排在第3和第4位的元素将分别得到3和4的等级)
- min: 将每个并列的元素分配到最低的等级(排在第3和第4位的元素都会得到3的等级)
- 最大:将每个并列的元素分配到最高等级(排在第3和第4位的元素都会得到4的等级)
- 随机:给每个并列的元素分配一个随机的等级(并列在第3和第4位的任何一个元素都可以得到任何一个等级)
其他资源
下面的教程解释了如何执行dplyr中的其他常见功能:
如何使用dplyr
按组选择第一行如何使用dplyr
计算相对频率如何使用dplyr
重新编码数值如何在dplyr中用零替换NA