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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:54:25