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
相关产品推荐
相关产品推荐

