如何移除存在过度表征类别值的列(R语言示例)
移除存在过度表征类别的数据列(R语言实现)
示例数据集
首先定义测试数据集:
data <- data.frame( Col1 = c("id1", "id2", "id3", "id4","id5", "id6", "id7", "id8"), Col2 = c("A", "Bc", "A", "As", "As", "Bs", "A", "A"), Col3 = c("BK", "AB", "BsC", "BX", "BK", "AsB", "BC", "BX"), Col4 = c("CA", "XB", "CA", "SC", "CA", "CA", "CA", "SC"), Col5 = c("Ao", "Bu", "Ai", "Ayy", "Ao", "Byu", "Aiy", "Ay"), Col6 = c("Bc", "Bc", "Bc", "Bc", "Bc", "Bc", "Be", "Bd") )
需求说明
设定一个占比阈值,对数据框的每一列进行检查:若列中存在任意一个类别的占比超过该阈值,则移除该列。
实现方法
方法1:基础R实现
编写自定义函数完成列筛选逻辑:
filter_overrepresented_cols <- function(data, threshold) { # 计算每列中类别占比的最大值 max_ratio <- sapply(data, function(col) { prop <- prop.table(table(col)) max(prop) }) # 保留最大占比不超过阈值的列 data[, max_ratio <= threshold, drop = FALSE] }
测试示例
- 阈值设为0.74时:
filtered_data_074 <- filter_overrepresented_cols(data, 0.74) print(filtered_data_074)
输出结果:
Col1 Col2 Col3 Col4 Col5 1 id1 A BK CA Ao 2 id2 Bc AB XB Bu 3 id3 A BsC CA Ai 4 id4 As BX SC Ayy 5 id5 As BK CA Ao 6 id6 Bs AsB CA Byu 7 id7 A BC CA Aiy 8 id8 A BX SC Ay
- 阈值设为0.6时:
filtered_data_06 <- filter_overrepresented_cols(data, 0.6) print(filtered_data_06)
输出结果:
Col1 Col2 Col3 Col5 1 id1 A BK Ao 2 id2 Bc AB Bu 3 id3 A BsC Ai 4 id4 As BX Ayy 5 id5 As BK Ao 6 id6 Bs AsB Byu 7 id7 A BC Aiy 8 id8 A BX Ay
方法2:tidyverse/dplyr实现
若习惯使用tidyverse生态,可用dplyr实现:
library(dplyr) library(tidyr) filter_overrepresented_cols_dplyr <- function(data, threshold) { # 计算每列的最大类别占比 col_max_ratio <- data %>% summarise(across(everything(), ~max(prop.table(table(.))))) %>% pivot_longer(everything(), names_to = "col", values_to = "max_ratio") # 筛选符合条件的列 keep_cols <- col_max_ratio %>% filter(max_ratio <= threshold) %>% pull(col) data %>% select(all_of(keep_cols)) }
使用方式与基础R版本一致,传入数据集和阈值即可得到过滤结果。
逻辑说明
两种方法核心逻辑统一:
- 对每一列计算各个类别出现的频率占比
- 提取该列中占比最大的类别对应的比例值
- 保留所有最大占比不超过设定阈值的列
内容的提问来源于stack exchange,提问作者S Das
相关产品推荐
相关产品推荐

