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

如何利用另一个DataFrame的值对目标DataFrame进行列子集筛选?

问题描述

我有一个存储筛选规则的DataFrame brief,其中的值对应筛选规则:

library(tidyverse)

brief <- data.frame(apple = 1, orange = 2, pear = 3)

另一个DataFrame types 是需要进行子集筛选的目标数据:

types <- data.frame(apple_cake = rnorm(5,0,1),
                    apple_pie = rnorm(5,0, 1),
                    apple_ice = rnorm(5,0, 1),
                    orange_cake = rnorm(5,0,1),
                    orange_pie = rnorm(5, 0, 1),
                    orange_ice = rnorm(5,0, 1),
                    pear_cake = rnorm(5,0,1),
                    pear_pie = rnorm(5, 0, 1),
                    pear_ice = rnorm(5,0, 1)
)

我需要利用brief中的规则筛选types的列:保留apple相关列的第1项、orange相关列的第2项、pear相关列的第3项,最终预期结果等价于:

final <- types %>% 
  select(apple_cake, orange_pie, pear_ice)

尝试过多种dplyr函数但未成功,查找类似案例也无法解决,因为那些案例的两个DataFrame列名相似度更高。

解决方案

可以通过以下步骤实现需求:

  • 将brief转换为长格式,明确每个水果对应的目标列索引
  • 对types的列名按水果前缀分组,匹配对应索引的列
  • 提取目标列并完成筛选

具体代码如下:

library(tidyverse)

# 转换筛选规则为长格式
brief_long <- brief %>% 
  pivot_longer(everything(), names_to = "fruit", values_to = "index")

# 匹配并提取目标列名
target_cols <- types %>% 
  colnames() %>% 
  enframe(name = NULL, value = "col") %>% 
  separate(col, into = c("fruit", "food"), sep = "_") %>% 
  group_by(fruit) %>% 
  mutate(group_index = row_number()) %>% 
  inner_join(brief_long, by = "fruit") %>% 
  filter(group_index == index) %>% 
  pull(col)

# 筛选目标列
final <- types %>% 
  select(all_of(target_cols))

运行后target_cols会返回c("apple_cake", "orange_pie", "pear_ice"),最终得到的final就是符合预期的子集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:05:21