如何使用命名列表筛选嵌套DataFrame的指定变量组合
筛选嵌套DataFrame的指定变量组合问题
你需要筛选符合c1与c2对应配对关系的组合,而非单纯判断c1、c2各自是否在集合中。之前的方法因为没有约束两者的对应关系,导致出现了不需要的组合。以下是两种可行的解决方案:
方法1:将命名列表转为配对数据框,用内连接筛选
先把命名格式的筛选规则转换成标准的(c1,c2)配对数据框,再通过内连接保留符合规则的组合:
library(tidyverse) # 模拟数据与嵌套处理(沿用你的代码) set.seed(1234) data <- tibble( c1 = rep(letters[1:3], each = 10), c2 = sample(letters[4:6], size = 30, replace = T), var1 = rnorm(30), var2 = rnorm(30) ) nested_data <- data %>% nest(.by = c(c1, c2)) # 目标组合命名列表 criteria <- list(a = c("d", "e"), b = "d") # 转换筛选规则为配对数据框 criteria_df <- enframe(criteria, name = "c1", value = "c2") %>% unnest(c2) # 筛选并展开数据 nested_data %>% inner_join(criteria_df, by = c("c1", "c2")) %>% unnest(data)
方法2:按行判断c2是否匹配对应c1的规则
通过rowwise()按行处理,直接判断当前行的c2是否属于对应c1的允许列表:
nested_data %>% rowwise() %>% filter(c2 %in% criteria[[c1]]) %>% unnest(data)
为什么之前的方法失效?
你之前的代码是独立判断c1 %in% 命名列表名称和c2 %in% 所有允许的c2值,没有约束两者的对应关系。比如c1="b"时,代码不会检查c2是否属于criteria[["b"]],只要c2在所有允许的c2集合(d,e)里就会被保留,因此出现了c1="b" & c2="e"的错误组合。
内容的提问来源于stack exchange,提问作者Xavier
相关产品推荐
相关产品推荐

