R语言for循环批量生成MCAR缺失值报错解决方法
MCAR梯度缺失数据集批量生成代码修正方案
问题背景
拟探究缺失值对心脏病数据集heart.ds的分析影响,需基于MCAR(完全随机缺失)机制生成缺失占比1%~10%的梯度缺失数据集,通过for循环批量实现时持续报错,需修正代码实现以下目标:
- 运行逻辑与单比例生成代码完全一致
- 输出各预设缺失比例对应的数据框
- 同步统计各数据集的缺失值总数
原错误实现代码
p = c(0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1) #generate missing values 1:10% nmv = rep(0, length(p)) hd_mcar = rep(0, length(p)) for(i in p){ hd_mcar[i] <- delete_MCAR(heart.ds, length(p)) #creating missing values nmv[i] <- sum(is.na(hd_mcar)) #checking the number of missing values genereated }
运行报错信息
Error in check_delete_args_general(ds, p, cols_mis, n_mis_stochastic) : probabilties in p must be between 0 and 1
可正常运行的单比例参考代码
#Missing Completely at Random(MCAR) hd_mcar <- delete_MCAR(heart.ds, 0.05) sum(is.na(hd_mcar))
错误原因
- 索引用法错误:直接用0.01~0.1的浮点值作为向量下标,R仅支持正整数作为向量/列表索引,浮点索引会触发取值异常
- 函数传参错误:
delete_MCAR的缺失概率参数传了固定值length(p)=10,没有传入当前循环对应的缺失比例,超出了函数要求的0~1概率范围直接触发报错 - 存储结构错误:用原子向量存储data.frame类型的数据集,原子向量仅支持存储基础标量类型,无法存放表格类数据
修正后可直接运行的代码
# 提前加载依赖包,未安装可先运行 install.packages("missMethods") library(missMethods) # 配置1%~10%的缺失比例梯度 p <- seq(0.01, 0.1, by = 0.01) # 初始化列表存储各比例的缺失数据集(列表支持存放任意类型的R对象) hd_mcar_list <- vector("list", length(p)) # 初始化数值向量存储各数据集的缺失值总数 nmv_count <- numeric(length(p)) # 按正整数索引遍历所有缺失比例 for(i in seq_along(p)){ # 传入当前比例生成MCAR缺失数据集,逻辑和单比例运行完全一致 hd_mcar_list[[i]] <- delete_MCAR(ds = heart.ds, p = p[i]) # 统计当前数据集的缺失值总数 nmv_count[i] <- sum(is.na(hd_mcar_list[[i]])) } # 为结果添加名称,方便按缺失比例快速索引 names(hd_mcar_list) <- paste0("MCAR_", p*100, "pct") names(nmv_count) <- paste0("MCAR_", p*100, "pct")
调用方式
- 取5%缺失比例的数据集:直接调用
hd_mcar_list[["MCAR_5pct"]],输出结果和单跑5%比例的代码完全一致 - 查看各数据集缺失值总数:直接打印
nmv_count即可看到对应比例下的缺失值统计结果
内容的提问来源于stack exchange,提问作者Maale Faustus
相关产品推荐
相关产品推荐

