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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:15:01