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

如何在R中统计OpenML数据集Diabetes130US各列'?'的数量

R统计数据框中?形式缺失值数量返回0的问题解答

问题背景

我正在处理OpenML平台的Diabetes130US数据集,该数据集共50个特征,标注为"0缺失值",但部分缺失值以?的形式存在。我需要统计每个特征中?的数量,再剔除缺失值占比过高的特征。
我先测试了模拟数据,运行逻辑正常:

# 创建模拟数据框
a <- c(1, 2, 4,'?', 58, 90, '?')
b <- c('?', 89, 90, 100, '?', 67, 900)
c <- c(57, 71, '?', '?', '?',76, 90)

df <- data.frame(a,b,c)

colSums(df=='?')

输出结果符合预期:

a b c 
2 2 3

但相同的方法应用到实际下载的数据集上时却返回0,对应列明明存在?值:

> colSums(phpvqZpLa[,6]=='?')
weight 
     0 
> phpvqZpLa[1,6]
# A tibble: 1 x 1
  weight
  <chr> 
1 '?'  

异常原因

  • 你的数据集是tibble格式,用[,列号]取列时返回的是1列的tibble对象而非向量,和字符串"?"逐元素比较的逻辑和向量比较存在差异,导致统计结果异常。
  • 从打印的单元格结果可以看到,存储的'?'是带单引号的字符串,也就是说单元格的真实值是"'?'"(包含左右两个单引号),而非你用来比较的纯问号"?",自然匹配不到对应值。

解决方法

确认真实取值

先运行以下代码查看目标列的唯一值,确认真实的缺失值格式:

unique(phpvqZpLa[[6]])

统计缺失值数量

如果确认真实缺失值就是纯?,用以下两种方式统计:

  1. 全局统计所有列的?数量:
colSums(phpvqZpLa == "?")
  1. 单列统计:用双括号取列向量后再比较
sum(phpvqZpLa[[6]] == "?")

如果确认真实缺失值是带单引号的'?',调整匹配字符串即可:

# 全局统计
colSums(phpvqZpLa == "'?'")

# 单列统计
sum(phpvqZpLa[[6]] == "'?'")

批量过滤高缺失占比列

如果需要直接剔除缺失占比过高的列,可以用以下方法批量处理,自动兼容带引号/不带引号的问号,也能避免多余空格的干扰:

library(dplyr)
library(stringr)

# 缺失值占比阈值,示例为20%
miss_threshold <- 0.2

df_clean <- phpvqZpLa %>%
  # 仅保留?占比低于阈值的列
  select(where(~ sum(str_detect(.x, fixed("?"))) / n() < miss_threshold))

内容的提问来源于stack exchange,提问作者oak tree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:18:03