如何在R中按组选择前N个值

473 阅读1分钟

你可以使用以下方法之一在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中执行其他常见操作:

如何在R中选择数值出现在任何列的行
如何在R中选择特定的列
如何在R中通过索引选择列