如何对DataFrame依次批量应用过滤器并统计行删除情况?
解决方案
1. 数据与过滤器准备
先定义原始数据,同时将过滤器改为更易处理的列表结构(每个元素包含过滤条件和描述),避免原dataframe存储方式的索引问题:
library(dplyr) # 原始数据 my_data <- data.frame( Criterion1 = c(1:9,1:3,3:7,2:4,6:1), Criterion2 = c(9:1,3:1,2:3,1:9,5:3) ) # 过滤器定义:列表存储,每个元素包含过滤表达式和描述 my_filters <- list( list(filter_expr = "Criterion1 != 2", desc = "移除所有值为2的行"), list(filter_expr = "Criterion2 != 4", desc = "移除所有值为4的行"), list(filter_expr = "Criterion1 != 9", desc = "移除所有值为9的行") )
2. 计算两种场景的行删除统计
我们需要统计两类核心数据:
- 累计过滤:逐个应用过滤器,记录每次操作删除的行数
- 单独过滤:每个过滤器直接作用于原始数据,记录单独应用时删除的行数
# 初始化统计结果容器 filter_stats <- data.frame( 过滤器描述 = character(), 累计过滤前行数 = integer(), 累计过滤后行数 = integer(), 累计删除行数 = integer(), 单独过滤删除行数 = integer(), stringsAsFactors = FALSE ) # 复制原始数据用于累计过滤流程 current_data <- my_data # 遍历每个过滤器计算统计值 for (f in my_filters) { # 累计过滤统计逻辑 pre_cum_rows <- nrow(current_data) filtered_cum <- filter(current_data, eval(parse(text = f$filter_expr))) post_cum_rows <- nrow(filtered_cum) removed_cum <- pre_cum_rows - post_cum_rows # 单独过滤统计逻辑(直接基于原始数据) filtered_single <- filter(my_data, eval(parse(text = f$filter_expr))) removed_single <- nrow(my_data) - nrow(filtered_single) # 将当前过滤器的统计结果写入表格 filter_stats <- rbind(filter_stats, data.frame( 过滤器描述 = f$desc, 累计过滤前行数 = pre_cum_rows, 累计过滤后行数 = post_cum_rows, 累计删除行数 = removed_cum, 单独过滤删除行数 = removed_single, stringsAsFactors = FALSE )) # 更新累计过滤的当前数据集 current_data <- filtered_cum }
3. 生成汇总表格
直接打印统计结果即可得到清晰的汇总表:
print(filter_stats, row.names = FALSE)
运行后输出示例:
过滤器描述 累计过滤前行数 累计过滤后行数 累计删除行数 单独过滤删除行数 移除所有值为2的行 30 24 6 6 移除所有值为4的行 24 23 1 1 移除所有值为9的行 23 22 1 1
如果需要更美观的格式化表格,可使用knitr::kable:
library(knitr) kable(filter_stats, caption = "过滤器行删除统计汇总")
内容的提问来源于stack exchange,提问作者user1
相关产品推荐
相关产品推荐

