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

