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

R语言使用dplyr创建衍生列时按指定分布填充缺失值异常

问题原因

R中ifelse()为向量化执行函数,会自动对返回结果做长度适配循环复用。你当前代码中的sample(x = c("m", "f"), prob = c(0.9, 0.1))未指定采样参数,默认会执行无放回采样,采样长度等于输入向量长度也就是2,仅返回1组长度为2的性别值。
而你数据中有8个缺失值需要填充,R会将得到的长度为2的采样结果循环复用4次填充所有NA,最终呈现两种性别交替出现的均匀分布效果,你设置的0.9/0.1概率仅作用于唯一一次的双样本采样,没有对每个缺失值独立生效。

解决方案

要让每个缺失值都按给定概率独立采样,需要对sample函数补全参数,指定采样数量与有放回采样规则,以下是两种可行写法:

写法1:保留dplyr管道流写法

library(dplyr)
set.seed(42)

df <- data.frame(
  gender = c("f", "m", "m", NA, NA, NA, NA, NA, NA, NA, NA)
)

df <- df %>%
  mutate(
    derived_gender_of_casualty = ifelse(
      is.na(gender),
      # 补全size=当前数据行数,replace=TRUE开启有放回独立采样
      sample(x = c("m", "f"), size = n(), prob = c(0.9, 0.1), replace = TRUE),
      as.character(gender)
    )
  )

写法2:仅对缺失值位置赋值(性能更优)

不需要对非缺失值做冗余判断,直接对NA位置赋值即可:

set.seed(42)
df <- data.frame(
  gender = c("f", "m", "m", NA, NA, NA, NA, NA, NA, NA, NA)
)

df$derived_gender_of_casualty <- df$gender
na_num <- sum(is.na(df$gender))
df$derived_gender_of_casualty[is.na(df$gender)] <- sample(c("m", "f"), size = na_num, prob = c(0.9, 0.1), replace = TRUE)

内容的提问来源于stack exchange,提问作者cs0815

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:27:03