如何用sample函数取同列非0随机值替换数据集0值且不生成多余列
问题原因
- 单列替换时
sample参数错误:你传入的ir$Sepal.Width != 0是逻辑判断结果,采样得到的是布尔值而非实际非0数值,导致0值没有被正确替换。 - 批量处理逻辑错误:
lapply循环的传入参数x就是当前遍历的单列数值向量,但你在函数内仍然调用全量数值列ir[,1:4],每轮循环都会输出4列结果,自然会生成多余列,且同样存在sample参数错误的问题。
修正代码
单列替换
ir$Sepal.Width <- ifelse( ir$Sepal.Width == 0, # 采样池为当前列的所有非0值,采样数量等于当前列0值的数量,开启有放回采样避免非0值不足 sample(ir$Sepal.Width[ir$Sepal.Width != 0], sum(ir$Sepal.Width == 0), replace = TRUE), ir$Sepal.Width )
批量处理所有数值列
用基础包lapply实现:
# 仅处理前4列数值列,非数值的species列保持不变 ir[, 1:4] <- lapply(ir[, 1:4], function(x) { non_zero_vals <- x[x != 0] ifelse(x == 0, sample(non_zero_vals, sum(x == 0), replace = TRUE), x) })
如果习惯用dplyr可以用更简洁的写法:
library(dplyr) ir <- ir %>% # 自动识别所有数值列进行替换 mutate(across(where(is.numeric), ~ ifelse( .x == 0, sample(.x[.x != 0], sum(.x == 0), replace = TRUE), .x )))
结果验证
运行替换代码后执行sum(ir[,1:4] == 0),返回结果为0即说明所有0值已替换完成。
内容的提问来源于stack exchange,提问作者me.limes
相关产品推荐
相关产品推荐

