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

