将top_n函数映射到分组数据

aya*_*ada 2 r dplyr tidyr

假设我有一个数据框:

value = c(1:5,16:20, 26:30)
group = c(rep("A", 5), rep("B", 5), rep("C", 5))
df = data.frame(value, group)
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的数据框,其中将包含每个组的top_n值,以使A组= 3的n,B组= 2的n和C组= 1的n。

# new dataframe should look like this:

  value group
1     5     A
2     4     A
3     3     A
4    20     B
5    19     B
6    30     C
Run Code Online (Sandbox Code Playgroud)

我认为我应该将top_n函数映射到我的数据,但是我一直在努力寻找正确的实现。

jay*_*.sf 6

您可以tailMap通话中使用。

do.call(rbind, Map(tail, split(df, df$group), 3:1))
#      value group
# A.3      3     A
# A.4      4     A
# A.5      5     A
# B.9     19     B
# B.10    20     B
# C       30     C
Run Code Online (Sandbox Code Playgroud)

注意:如果数据排序不如给定示例中那样好,则进行事前排序df <- with(df, df[order(group, value), ])

数据

df <- structure(list(value = c(1L, 2L, 3L, 4L, 5L, 16L, 17L, 18L, 19L, 
20L, 26L, 27L, 28L, 29L, 30L), group = structure(c(1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor")), class = "data.frame", row.names = c(NA, 
-15L))
Run Code Online (Sandbox Code Playgroud)