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

如何移除DataFrame中含高占比统一值的列?

过滤DataFrame中高占比单一值的列

核心思路

对DataFrame的每一列,计算其中**出现频率最高的值(包括NA)**的占比,若该占比超过设定阈值(如90%),则移除该列。

R实现代码

1. 构造测试数据

先创建一个包含多种高占比单一值的测试DataFrame:

set.seed(123)
df <- data.frame(
  col1 = c(rep(0, 95), sample(1:5, 5)),   # 0占95%
  col2 = c(rep(NA, 92), sample(1:3, 8)),  # NA占92%
  col3 = c(rep(-999, 98), sample(c(100, 200), 2)),  # -999占98%
  col4 = sample(1:10, 100, replace = TRUE),  # 无高占比单一值
  col5 = c(rep("x", 90), sample(c("y", "z"), 10))  # x占90%
)

2. 自定义过滤函数

写一个通用函数,支持自定义阈值:

filter_high_uniformity_cols <- function(df, threshold = 0.9) {
  # 遍历每一列,计算该列最高频值的占比(含NA)
  max_value_ratio <- sapply(df, function(col) {
    # 统计所有值(含NA)的出现次数
    value_counts <- table(addNA(col))
    # 计算最高频值的占比
    max(value_counts) / length(col)
  })
  
  # 保留最高频值占比低于阈值的列,drop=FALSE避免单列转为向量
  df[, max_value_ratio < threshold, drop = FALSE]
}

3. 使用函数过滤

# 移除单一值占比超过90%的列
filtered_df <- filter_high_uniformity_cols(df, threshold = 0.9)

# 查看过滤结果
str(filtered_df)

代码说明

  • addNA(col):将NA视为一个独立的统计类别,确保NA的占比也被纳入计算
  • table():统计列中每个值(含NA)的出现次数
  • sapply():批量处理DataFrame的每一列,得到所有列的最高频值占比
  • drop=FALSE:当过滤后只剩一列时,仍保持DataFrame格式,避免转为向量

如果需要仅针对非NA值的占比进行过滤,可以修改函数,先剔除NA再统计频率:

# 仅考虑非NA值的高占比情况
filter_high_uniformity_non_na <- function(df, threshold = 0.9) {
  max_value_ratio <- sapply(df, function(col) {
    non_na_col <- col[!is.na(col)]
    if (length(non_na_col) == 0) return(1)  # 全NA的列直接标记为需移除
    value_counts <- table(non_na_col)
    max(value_counts) / length(non_na_col)
  })
  df[, max_value_ratio < threshold, drop = FALSE]
}

内容的提问来源于stack exchange,提问作者Alibek Galiyev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:35:22