You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用dplyr按年筛选top n高op值观测并聚合变量

用dplyr实现按年份筛选Top N观测并聚合数据

需求说明

处理大型R语言DataFrame,完成以下操作:

  • 按年份分组,筛选每个年度op值最高的N条观测(示例中N=2,可调整为1000)
  • 对筛选后的观测,聚合op、tr、cp变量(示例为求和)
  • 使用dplyr实现,优先避免自定义函数,保证大数据量处理效率

示例数据

df <- data.frame(
  year = c(1984,1985,1986,1987,1988,1985,1986,1987,1988,1985,1986,1986,1987,1988),
  id = c(1,1,1,1,1,2,2,2,2,3,3,4,4,4),
  op = c(10,20,30,40,50,15,17,18,19,20,22,10,20,40),
  tr = c(10,20,30,40,50,15,17,18,19,20,22,10,20,40),
  cp = c(10,20,30,40,50,15,17,18,19,20,22,10,20,40)
)

解决方案

使用dplyr的slice_max函数高效筛选分组内Top N观测,再进行聚合:

library(dplyr)

# 定义要保留的Top N数量,可调整为1000
n_top <- 2

result <- df %>%
  group_by(year) %>%
  # 按op降序取前n_top条,with_ties=FALSE表示op相同时只取指定数量
  slice_max(order_by = op, n = n_top, with_ties = FALSE) %>%
  # 聚合求和,可替换为mean/median等其他函数
  summarise(
    op2 = sum(op),
    tr2 = sum(tr),
    cp2 = sum(cp),
    .groups = "drop" # 取消分组,减少内存占用,适合大数据
  ) %>%
  rename(year2 = year) # 重命名年份列匹配预期输出

代码说明

  • slice_max是dplyr针对分组Top N筛选的优化函数,比自定义排序取数效率更高,适合大数据量
  • 若需要保留所有op值相同的Top观测,将with_ties设为TRUE即可
  • .groups = "drop"确保处理后取消分组,避免不必要的内存开销
  • 聚合函数可根据业务需求替换,比如求均值用mean(op)

预期输出

print(result)
#   year2 op2 tr2 cp2
# 1  1984  10  10  10
# 2  1985  40  40  40
# 3  1986  52  52  52
# 4  1987  60  60  60
# 5  1988  90  90  90

内容的提问来源于stack exchange,提问作者Ayoze Alfageme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:25:18