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

基于不同条件筛选不同变量的嵌套数据处理问题

按分组自定义筛选嵌套数据的解决方案

针对你需要按A列分组后,为不同分组应用不同筛选条件的需求,我们可以结合dplyr的分组嵌套和purrr的映射函数来实现,下面是具体的步骤和代码:

1. 准备模拟数据

首先加载所需包并构造你提供的模拟数据:

library(tidyverse)

df <- tibble::tribble(
  ~A, ~B, ~C,
  "e", 2L, 6L,
  "e", 5L, 8L,
  "e", 5L, 3L,
  "f", 3L, 8L,
  "f", 4L, 1L,
  "f", 5L, 6L,
  "g", 3L, 9L,
  "g", 4L, 2L,
  "g", 5L, 7L,
  "h", 5L, 4L
)

2. 分组嵌套数据

先把数据按A列分组并嵌套,这样每个分组的原始数据会被打包成一个单独的小数据框,方便后续逐个处理:

nested_df <- df %>% 
  group_by(A) %>% 
  nest()

此时nested_df会有两列:A(分组名)和data(对应分组的原始数据框)。

3. 为每个分组应用自定义筛选

这里有两种清晰的实现方式,你可以根据自己的习惯选择:

方式一:直接用case_when + map

在mutate里通过case_when匹配分组名,并用map把筛选逻辑应用到每个嵌套的数据框:

filtered_nested <- nested_df %>% 
  mutate(filtered_data = case_when(
    # e组:筛选B < 4的行
    A == "e" ~ map(data, ~ filter(.x, B < 4)),
    # f组:筛选C > 5的行
    A == "f" ~ map(data, ~ filter(.x, C > 5)),
    # g组:筛选B >=4 且 C >3的行(可替换为你的自定义条件)
    A == "g" ~ map(data, ~ filter(.x, B >= 4 & C > 3)),
    # h组:筛选C <5的行(可替换为你的自定义条件)
    A == "h" ~ map(data, ~ filter(.x, C < 5)),
    # 默认情况:未匹配的分组返回原数据
    TRUE ~ map(data, ~ .x)
  ))

方式二:自定义筛选函数 + map2

如果你的筛选逻辑比较复杂,或者需要复用,推荐把筛选逻辑封装成函数,再用map2同时传递分组名和数据框:

# 定义根据分组名执行筛选的函数
filter_by_group <- function(group_name, data) {
  case_when(
    group_name == "e" ~ filter(data, B < 4),
    group_name == "f" ~ filter(data, C > 5),
    group_name == "g" ~ filter(data, B >= 4 & C > 3),
    group_name == "h" ~ filter(data, C < 5),
    TRUE ~ data
  )
}

# 应用函数到每个分组
filtered_nested <- nested_df %>% 
  mutate(filtered_data = map2(A, data, filter_by_group))

4. 展开嵌套数据得到最终结果

如果需要把筛选后的数据恢复成普通的表格格式,用unnest即可:

final_df <- filtered_nested %>% 
  select(A, filtered_data) %>% 
  unnest(filtered_data)

最终的final_df就是按分组自定义筛选后的结果,比如:

  • e组只保留了B=2的行
  • f组保留了C=8和C=6的行
  • g组只保留了B=5且C=7的行
  • h组保留了唯一的行(因为C=4<5)

这种方法的优势是可以灵活扩展每个分组的筛选条件,不管条件有多复杂,都能在case_when里对应编写,非常适配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:09:43