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

如何用dplyr提取数据框中par变量指定正负值对应的条目?

使用dplyr提取指定par值对应的条目

首先生成原始测试数据(注意避免使用R内置函数名table作为变量名,改用table_df):

set.seed(12)
table_df <- 
  data.frame(
    value = rnorm(n = 10), 
    par = runif(n = 10, min = -1, max = 1)
  )

无分组数据的处理方案

通过拆分正负par条目、分别筛选后合并的方式,用dplyr实现需求:

library(dplyr)

result <- table_df %>%
  # 筛选par为负数的条目,取最大的2个(最接近0的两个负数)
  filter(par < 0) %>%
  slice_max(order_by = par, n = 2) %>%
  # 合并par为正数的条目,取最小的2个(最接近0的两个正数)
  bind_rows(
    table_df %>%
      filter(par > 0) %>%
      slice_min(order_by = par, n = 2)
  )

# 输出结果与预期一致
result

分组数据的复用方案

如果数据包含分组变量,使用group_modify对每个分组单独执行逻辑,实现复用:

# 生成带分组的测试数据
set.seed(12)
grouped_df <- 
  data.frame(
    group = rep(c("A", "B"), each = 10),
    value = rnorm(n = 20), 
    par = runif(n = 20, min = -1, max = 1)
  )

# 分组处理
grouped_result <- grouped_df %>%
  group_by(group) %>%
  group_modify(~ {
    .x %>%
      filter(par < 0) %>%
      slice_max(order_by = par, n = 2) %>%
      bind_rows(
        .x %>%
          filter(par > 0) %>%
          slice_min(order_by = par, n = 2)
      )
  }) %>%
  ungroup()

grouped_result

关键函数说明

  • slice_max: 按指定列提取最大的n条记录,用于筛选最接近0的负数;
  • slice_min: 按指定列提取最小的n条记录,用于筛选最接近0的正数;
  • group_modify: 对分组数据的每个子组应用自定义处理逻辑,适配多分组场景;
  • bind_rows: 将两部分筛选结果合并为一个数据框。

内容的提问来源于stack exchange,提问作者Mr Frog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:40:30