R语言mutate()按条件生成新变量触发seq.default报错
报错原因
- 直接触发报错的核心原因是
seq()函数的步长逻辑冲突:你硬编码了步长参数by=1(即序列逐次+1生成),但当计算得到的区间起点大于终点时(比如区间上界Age-Educ_y-6为负数时,起点(Age-Educ_y-6)/2会大于终点),逐次+1永远无法抵达终点,就会抛出"by参数符号不正确"的错误。 - 代码存在两处拼写错误:原数据的智商列名为
iQ(Q为大写),你代码中写为全小写的iq;目标新变量名为Exp_y,你错拼为Exep_y。 case_when()的运行机制会对所有条件分支的右侧表达式做全量求值,哪怕某行不满足对应分支的判断条件,也会执行分支内的计算逻辑,因此哪怕是应该赋值为0的行,只要触发了seq()的步长冲突,就会直接报错中断。- 存在逻辑漏洞:没有对计算得到的工作年限区间做合法性校验,当
Age-Educ_y-6为负数时,会生成无意义的负工作年限。
修正方案
直接用runif()生成指定区间的均匀随机数替代seq()+sample()的写法,从根源避免序列步长的报错,同时修正拼写错误、补充边界合法性判断,用完rowwise()后及时解除行分组避免影响后续操作。如果需要整数型工作年限,在runif()外层套round()或者as.integer()即可。
library(dplyr) Df <- Df %>% rowwise() %>% mutate(Exp_y = case_when( Age >= 15 & iQ <= 2 ~ runif(1, min = (Age - 15)/2, max = Age - 15), Age >= 15 & between(iQ, 3, 4) ~ { upper <- Age - Educ_y - 6 ifelse(upper > 0, runif(1, min = upper/2, max = upper), 0) }, TRUE ~ 0 )) %>% ungroup()
运行以上代码对你提供的示例数据生成的Exp_y完全符合设定规则,不会触发报错。
内容的提问来源于stack exchange,提问作者Majed
相关产品推荐
相关产品推荐

