假设我有一个数据框:
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函数映射到我的数据,但是我一直在努力寻找正确的实现。
您可以tail在Map通话中使用。
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)