如何在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]])
统计缺失值数量
如果确认真实缺失值就是纯?,用以下两种方式统计:
- 全局统计所有列的
?数量:
colSums(phpvqZpLa == "?")
- 单列统计:用双括号取列向量后再比较
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
相关产品推荐
相关产品推荐

