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

如何用dplyr过滤R数据框:保留B大的行C值更小的A组?

使用dplyr实现指定数据过滤需求

当然可以用dplyr实现这个需求,核心思路是按A分组后,判断组内是否满足“B值较大的行的C值小于B值较小的行的C值”,再保留符合条件的组的所有行。

示例数据构造

先还原你的示例数据:

library(dplyr)

df <- tibble(
  A = c(1, 1, 2, 2),
  B = c(2, 4, 2, 4),
  C = c(5, 6, 7, 6)
)

简洁版过滤

直接在filter中完成组内条件判断:

result <- df %>%
  group_by(A) %>%
  filter(C[which.max(B)] < C[which.min(B)]) %>%
  ungroup()

执行后得到的结果就是你需要的:

print(result)
#> # A tibble: 2 × 3
#>       A     B     C
#>   <dbl> <dbl> <dbl>
#> 1     2     2     7
#> 2     2     4     6

分步清晰版(适合理解逻辑)

如果需要更清晰的步骤,可以先通过mutate添加辅助列标记符合条件的组,再过滤:

result <- df %>%
  group_by(A) %>%
  mutate(
    # 提取组内B较小时的C值
    c_small_b = C[which.min(B)],
    # 提取组内B较大时的C值
    c_large_b = C[which.max(B)],
    # 标记该组是否满足需求
    is_valid = c_large_b < c_small_b
  ) %>%
  filter(is_valid) %>%
  # 移除临时辅助列
  select(-c_small_b, -c_large_b, -is_valid) %>%
  ungroup()

两种方法本质逻辑一致,都是利用group_by(A)将数据按A值分组,再通过which.min(B)和which.max(B)定位组内B值的大小对应的行,最后判断C值的关系来筛选组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:30:42