如何在R中将dplyr筛选条件存入向量并组合应用计算交集行数
错误原因
- 你用
c()拼接多个数据框时,R会自动将所有数据框的列拆分为列表元素,而非将每个完整数据框作为独立元素存储,自然没法正常执行取交集操作 - 代码存在拼写错误:变量名
filter_insection和filter_intersection不一致,且print语句缺右括号,也会导致运行异常 - 双重循环会重复计算相同组合(比如i=1,j=2和i=2,j=1是同一个交集),效率很低
方案1:直接基于已生成的筛选子集计算
把你生成的8个筛选后的数据集存入列表而非普通向量,之后遍历组合计算:
# 1. 把筛选后的数据集存入列表,每个元素是一个完整数据框 filter_list <- list(filter1, filter2, filter3, filter4, filter5, filter6, filter7, filter8) # 可以给列表加个命名方便识别结果 names(filter_list) <- paste0("filter",1:8) # 2. 生成所有不重复的两两组合,避免重复计算 combs <- combn(length(filter_list), 2, simplify = FALSE) # 3. 遍历组合计算交集行数 result <- lapply(combs, function(idx){ set1 <- filter_list[[idx[1]]] set2 <- filter_list[[idx[2]]] inter_row <- nrow(dplyr::intersect(set1, set2)) return(data.frame( filter_a = names(filter_list)[idx[1]], filter_b = names(filter_list)[idx[2]], intersect_rows = inter_row )) }) # 把结果合并为一个数据框查看 final_result <- do.call(rbind, result)
如果要包含筛选条件和自身的交集(也就是单个筛选的结果行数),把combn的逻辑替换成全量组合即可。
方案2:直接存储筛选条件,按需组合计算(更推荐)
不用提前生成8个筛选后的子集,直接把筛选条件存为表达式列表,组合后一次性计算交集行数,内存效率更高,修改也更方便:
library(dplyr) library(rlang) # 1. 把你的8个筛选条件存为表达式列表,对应你原来的筛选逻辑 filter_exprs <- list( filter1 = expr(var1 == x), filter2 = expr(var2 == y), filter3 = expr(var3 == a), filter4 = expr(var4 == b), filter5 = expr(var5 == c), filter6 = expr(var6 == d), filter7 = expr(var7 == e), filter8 = expr(var8 == z) ) # 2. 生成两两组合 combs <- combn(length(filter_exprs), 2, simplify = FALSE) # 3. 组合两个条件直接筛选原数据,得到的就是交集,不用单独调用intersect result <- lapply(combs, function(idx){ # 组合两个筛选条件 combined_expr <- expr(!!filter_exprs[[idx[1]]] & !!filter_exprs[[idx[2]]]) # 直接在原数据上筛选,行数就是交集行数 inter_row <- data %>% filter(!!combined_expr) %>% nrow() return(data.frame( filter_a = names(filter_exprs)[idx[1]], filter_b = names(filter_exprs)[idx[2]], intersect_rows = inter_row )) }) final_result <- do.call(rbind, result)
内容的提问来源于stack exchange,提问作者Michiel V.
相关产品推荐
相关产品推荐

