使用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
相关产品推荐
相关产品推荐

