You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除存在过度表征类别值的列(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版本一致,传入数据集和阈值即可得到过滤结果。

逻辑说明

两种方法核心逻辑统一:

  1. 对每一列计算各个类别出现的频率占比
  2. 提取该列中占比最大的类别对应的比例值
  3. 保留所有最大占比不超过设定阈值的列

内容的提问来源于stack exchange,提问作者S Das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:37:42