R语言删除数据框中零值占比超阈值列的代码执行失效问题求解
故障原因
- 变量名大小写不匹配:首行定义的变量名是
ZeroValRatio(首字母大写Z),第二行rename调用时错写为zeroValRatio(首字母小写z),会触发对象未找到错误,若运行时忽略报错继续执行,会调用环境中残留的旧zeroValRatio对象,导致计算逻辑完全偏离预期。 - 数值比较误用字符串格式:筛选阈值
"0.3198630137"被包裹引号转为字符串类型,R会执行字典序比较而非数值大小比较,筛选出来的待删除列完全不符合要求。 - 待删除列名提取逻辑错误:经过多轮转换后
drop是数据框类型,而非待删除列名的字符向量:- 执行
names(train1) %in% drop时,%in%是判断字符是否存在于数据框的元素值中,而非判断是否为待删除列名,因此返回全为FALSE,导致df2保留所有列 colnames(drop)==colnames(train1)是逐位置相等判断,而非集合匹配,只有两对象列顺序完全对应时才会返回正确结果,大部分场景下会遗漏匹配项,导致该删的列没删掉。
- 执行
修复后的实现代码
无需多次转换数据框和转置,直接生成待删除的列名字符向量即可:
# 计算每列零值比例 zero_ratio <- colSums(train1 == 0) / nrow(train1) # 指定阈值,筛选出比例高于阈值的列名 threshold <- 0.3198630137 drop_cols <- names(zero_ratio)[zero_ratio > threshold] # 删除对应列 df <- train1[, !names(train1) %in% drop_cols]
如果偏好dplyr语法,可以用更简洁的写法:
library(dplyr) df <- train1 %>% select(where(~sum(.x == 0)/n() <= 0.3198630137))
内容的提问来源于stack exchange,提问作者user17181673
相关产品推荐
相关产品推荐

