R中使用dplyr的mutate时如何通过for循环迭代逐行赋值?
R代码逐行生成独立随机数解决方案
问题根源
你代码中调用runif(1, 0, 8)仅生成1个随机标量,dplyr会自动将这个标量广播到数据的所有行,因此所有行使用的相加值完全一致。同理你的rbinom参数中runif(1,0.34,0.37)也会让所有行使用同一个概率生成异常标记,若需要每行概率独立也需要同步调整。
解决方案
方案1:向量化生成匹配行数的随机数(推荐,执行效率更高)
直接将runif的第一个参数(生成随机数的个数)设置为n(),n()在dplyr的mutate语境下会自动返回当前数据集的行数,一次性生成和行数匹配的独立随机数:
mutate(enter_sim_time = arrive_hrs) %>% # 新增列记录抵达时间 # 若需要固定全局异常概率,可直接写固定数值即可,比如0.355 mutate(exc_flag = rbinom(n(), 1, runif(n(), 0.34, 0.37))) %>% # 新增列标记工作项是否流转至异常流程 mutate(exc_enter_sim_time = ifelse(exc_flag == 1, enter_sim_time + runif(n(), 0, 8), enter_sim_time))
方案2:逐行迭代模式(可读性强,适合复杂逐行逻辑场景)
使用dplyr的rowwise()开启逐行运算模式,每行都会独立执行一次随机数生成逻辑,运算结束后需调用ungroup()取消行分组避免影响后续操作:
mutate(enter_sim_time = arrive_hrs) %>% # 新增列记录抵达时间 rowwise() %>% mutate( exc_flag = rbinom(1, 1, runif(1, 0.34, 0.37)), # 新增列标记工作项是否流转至异常流程 exc_enter_sim_time = ifelse(exc_flag == 1, enter_sim_time + runif(1, 0, 8), enter_sim_time) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者Resh
相关产品推荐
相关产品推荐

