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

如何用dplyr直接保留分组数据中指定比例的前序行?

使用dplyr实现按组保留指定比例的前序行

当然可以用dplyr一步到位解决这个需求!完全不需要split加自定义函数的两步操作,咱们用group_by()搭配slice()就能完美实现,而且全程不会打乱你原本的id排序。

先重现你的测试数据:

library(dplyr)
proportion = 0.5; set.seed(1)
df = data.frame(id=1:6, name=c("a", "a", "b"), value=rnorm(6)) %>% arrange(name)

核心的dplyr处理代码如下:

df %>%
  group_by(name) %>%
  slice(1:floor(n() * proportion)) %>%
  ungroup()

代码解释:

  • group_by(name):先按你的分组变量name对数据分组
  • slice(1:floor(n() * proportion)):n()会自动获取当前组的行数,乘以指定比例后用floor()向下取整(如果需要向上取整可以换成ceiling()),然后选取每组的前N行,完全保留组内原有的排序(也就是你之前按id排好的顺序)
  • ungroup():最后取消分组,回到常规的data.frame格式

运行这段代码后,得到的结果和你之前的两步解法完全一致:

# A tibble: 3 × 3
     id name   value
  <int> <chr>  <dbl>
1     1 a     -0.626
2     2 a      0.184
3     3 b     -0.836

额外说明:

如果你的比例计算后得到小数(比如用0.65,假设某组有4行,4*0.65=2.6),你可以根据需求调整取整方式:

  • 用floor():向下取整,保留2行
  • 用ceiling():向上取整,保留3行
  • 用round():四舍五入,保留3行

内容的提问来源于stack exchange,提问作者agenis - code en bois

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:12:13