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

如何用更简洁的dplyr方法按比例过滤向量中的负值?

简洁优雅的dplyr实现:保留正值与最后1/3负值

给定包含有序正负值的向量:

x <- c(-35, -30, -25, -20, -15, -10, -5, -2, -1, -0.5, 0, 5, 22, 77)

需求:保留所有正值与0,仅保留最后1/3的负值。原解决方案逻辑繁琐,以下是更简洁的dplyr实现方式。

优化后的代码

library(dplyr)

tibble(x) %>%
  mutate(is_neg = x < 0) %>%
  group_by(is_neg) %>%
  filter(!is_neg | row_number() > n() - ceiling(n()/3)) %>%
  ungroup()

逻辑说明

  1. 用is_neg标记所有负值元素
  2. 按是否为负值分组:
    • 非负值组(正值、0)直接全部保留
    • 负值组内通过row_number() > n() - ceiling(n()/3)筛选出最后ceiling(n()/3)个负值(ceiling向上取整,保证结果和原示例一致)

原方案对比

原方案通过生成x_neg、id、x_neg_length等多个辅助列实现筛选,步骤冗余。优化后的方案直接通过分组+行号筛选,代码更简洁易读,逻辑更直观。

内容的提问来源于stack exchange,提问作者Chris Ruehlemann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:20:05