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

