简单R代码IF/ELSE、FOR循环报错输出含NA、长度不符如何解决?
问题诊断
- 未定义
period变量:代码中判断条件用到的period没有提前赋值,访问period[i+1]会返回NA,导致if语句无法完成布尔判断,触发报错。按照需求,此处直接判断当前的周期序号i+1即可,不需要额外的period变量。 - 向量越界访问:
vector_2只有4个元素,当i+1 > 4时,vector_2[i+1]的返回值为NA,这就是输出第5位为NA的原因。 - 循环范围错误:设置
n_periods=10预期输出10个元素,但循环范围是1:n_periods,最终会给a[11]赋值,导致输出长度不符合预期,循环上限应该设为n_periods-1。
修正后代码
保留原for循环逻辑的版本
n_periods = 10 vector_1 <- c(1,2,3,4) vector_2 <- c(0.20,0.10,0.05,0.3) max_v1 <- max(vector_1) a <- ifelse(vector_1[1] < 1, 0, vector_2[1]) # 调整循环上限避免索引越界 for(i in 1:(n_periods-1)){ current_period <- i + 1 if(current_period > max_v1){ a[i+1] = 0 } else { a[i+1] = vector_2[i+1] } } a
更符合R语法的向量化实现版本(无需for循环)
n_periods = 10 vector_1 <- c(1,2,3,4) vector_2 <- c(0.20,0.10,0.05,0.3) # 提前初始化指定长度的输出向量 a <- numeric(n_periods) # 赋值已知数值 a[1:length(vector_2)] <- vector_2 # 超出最大周期的位置统一赋值为0 a[seq_along(a) > max(vector_1)] <- 0 a
输出结果
两个版本运行后都可以得到预期输出:[1] 0.20 0.10 0.05 0.30 0.00 0.00 0.00 0.00 0.00 0.00
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

