你可以使用以下方法之一在R中按组选择前N个值。
方法1:按组选择前N个值(忽略领带)
library(dplyr)
#select top 5 values by group
df %>%
arrange(desc(values_column)) %>%
group_by(group_column) %>%
slice(1:5)
方法2:按组选择前N个值(包括领带)
library(dplyr)
#select top 5 values by group
df %>%
group_by(group_column) %>%
top_n(5, values_column)
下面的例子展示了如何在R语言中用下面的数据框来使用每种方法。
#create data frame
df <- data.frame(team=c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'),
points=c(19, 22, 15, NA, 14, 25, 25, 25),
rebounds=c(10, 6, 3, 7, 11, 13, 9, 12))
#view data frame
df
team points rebounds
1 A 19 10
2 A 22 6
3 A 15 3
4 A NA 7
5 B 14 11
6 B 25 13
7 B 25 9
8 B 25 12
例子1:按组选择前N个值(忽略领带)
下面的代码显示了如何按球队分组,选择积分最高的前两行。
library(dplyr)
#select top 2 rows with highest points values, grouped by team
df %>%
arrange(desc(points)) %>%
group_by(team) %>%
slice(1:2)
# A tibble: 4 x 3
# Groups: team [2]
team points rebounds
1 A 22 6
2 A 19 10
3 B 25 13
4 B 25 9
输出包含了每支球队积分最高的两行。
请注意,对于B队来说,实际上有三行的最高分值是并列的(25),但是在输出中只返回两行。
这个方法只是忽略了并列的情况。
例2:按组选择前N个值(包括平局)
下面的代码显示了如何选择最高分值的前两行,按球队分组。
library(dplyr)
#select top 2 rows with highest points values, grouped by team
df %>%
group_by(team) %>%
top_n(2, points)
# A tibble: 5 x 3
# Groups: team [2]
team points rebounds
1 A 19 10
2 A 22 6
3 B 25 13
4 B 25 9
5 B 25 12
输出结果包含了每支球队的最高分值的两行。
请注意,对于B队来说,有三行的最高分值是并列的(25),所以这个方法在最后的输出中包括了所有这三行。
其他资源
下面的教程解释了如何在R中执行其他常见操作: