在mutate()与case_when()中使用sample()函数的问题求助
问题解决:创建符合规则的随机变量c
你的需求是:当a不为缺失值时,c取对应行的b值;当a为缺失值时,c随机取0或对应行的b值。原代码逻辑存在问题,导致结果不符合预期。
原代码的问题
原代码中sample(c(0,b),n(),replace=TRUE)的写法错误:
c(0,b)会把0和整个b列的所有值合并成一个向量(比如这里是c(0,2,4,5,1)),然后抽样n()次,这是从这个大集合里随机选值,而非针对每个a为NA的行,在0和该行的b值之间二选一,完全偏离需求。
正确解法
可以用case_when结合runif实现逐行的随机二选一,代码如下:
library(dplyr) df2 <- data.frame(a = c(1,NA,6,NA), b = c(2,4,5,1)) df2 <- df2 %>% mutate(c = case_when( !is.na(a) ~ b, # a非缺失时,c直接取b is.na(a) ~ ifelse(runif(n()) > 0.5, 0, b) # a缺失时,50%概率取0,50%取该行b ))
也可以用更简洁的ifelse嵌套写法:
df2 <- df2 %>% mutate(c = ifelse(is.na(a), ifelse(runif(n()) > 0.5, 0, b), b))
运行后,a为NA的行(第2、4行)的c会随机呈现0或对应b的值,非NA行的c则与b完全一致,符合需求。
内容的提问来源于stack exchange,提问作者Chloe_pa
相关产品推荐
相关产品推荐

