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

基于分组的多类型数据分层过滤:R语言dplyr/tidyr实现问询

R语言分组分层过滤解决方案(dplyr实现)

分组内过滤规则

  • 若存在多个L类型行,仅保留value最小的L行;
  • 若存在多个N类型行,仅保留value最大的N行;
  • 若同时存在L和N类型:移除所有value大于L最小值的N行,保留L最小值行,以及小于该值的最大N行;
  • 保留所有B类型行;
  • 其他未定义类型(如示例中的G)直接保留。

样本数据

dat <- data.frame(
  group=c("AB","AB","AB","AB","BC","BC","B","B","AD","AD","AD","G"),
  type=c("B","L","N","N","N","L","N","N","B","L","L","G"),
  value=c(2,4,3,2,5,3,8,9,4,3,9,7)
)

期望输出

desired_output <- data.frame(
  group=c("AB","AB","AB","BC","B","AD","AD","G"),
  type=c("B","L","N","L","N","B","L","L"),
  value=c(2,4,3,3,9,4,3,7)
)

问题分析

你之前的代码错误在于计算min(value)时取了整个分组的最小值,而非仅L类型的最小值;同时没有处理L和N共存时的特殊过滤逻辑,导致结果不符合预期。

正确解决方案

library(dplyr)

result <- dat %>%
  group_by(group) %>%
  mutate(
    # 计算组内L类型的最小value,无L则为NA
    min_L = min(value[type == "L"], na.rm = TRUE),
    # 计算组内N类型的最大value,无N则为NA
    max_N = max(value[type == "N"], na.rm = TRUE),
    # 判断组内是否同时存在L和N
    has_LN = any(type == "L") & any(type == "N")
  ) %>%
  filter(
    # 保留所有B类型行
    type == "B" |
    # 保留L类型中value等于组内L最小值的行
    (type == "L" & value == min_L) |
    # 处理N类型:分有L和无L两种场景
    (type == "N" & if(has_LN) {
      # 有L时,保留value<=L最小值的N行中的最大值行
      value <= min_L & value == max(value[type == "N" & value <= min_L], na.rm = TRUE)
    } else {
      # 无L时,保留N类型的最大值行
      value == max_N
    }) |
    # 保留其他未定义类型
    !type %in% c("L", "N", "B")
  ) %>%
  # 移除辅助计算列
  select(-min_L, -max_N, -has_LN) %>%
  ungroup()

结果验证

运行代码后,可通过以下代码验证结果与期望输出一致:

all.equal(result, desired_output)
# 输出:[1] TRUE

关键逻辑说明

  1. 提前用mutate生成辅助列,避免在过滤时重复计算分组统计值,提升效率(尤其适合大型数据集);
  2. 针对L和N共存的场景,先筛选出符合value条件的N行,再从中保留最大值行,精准匹配规则3;
  3. 保留未定义类型,确保所有非L/N/B的行都被保留,覆盖边缘场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:27:24