R语言循环计算预算列时出现'参数长度为零'错误求助
问题排查与解决方案
错误原因分析
- 列名拼写错误:代码中误用了小写的
df1$period,但数据框的列名是大写的Period,导致访问不存在的列。当i=1时,df1$period[i-1]即df1$period[0]返回长度为0的对象,直接触发if条件判断的错误。 - 赋值逻辑缺失:else分支仅计算了表达式,未将结果赋值给
Final_Budget[i],导致无法填充目标列数据。 - 索引边界处理疏漏:虽然有
i==1的前置判断,但因拼写错误,仍会执行到df1$period[i]!=df1$period[i-1]的判断,进一步加剧错误。
修正后的循环代码
df1 <- data.frame(Cost = c(1000,500,200,200,100,300,200), budgetv2 = c(10000,10000,10000,500,500,700,700), Period = c("Januari","Januari","Januari","Februari","Februari","Maret","Maret"), Final_Budget = c(NA,NA,NA,NA,NA,NA,NA)) for (i in 1:nrow(df1)) { # 判断是否为当月第一行 if (i == 1 || df1$Period[i] != df1$Period[i-1]) { df1$Final_Budget[i] <- df1$budgetv2[i] } else { # 修正赋值逻辑,正确计算并赋值 df1$Final_Budget[i] <- df1$budgetv2[i] + df1$Final_Budget[i-1] - df1$Cost[i-1] } } # 查看结果 df1
运行后将得到期望的结果:
| Cost | budgetv2 | Period | Final_Budget |
|---|---|---|---|
| 1000 | 10000 | Januari | 10000 |
| 500 | 10000 | Januari | 19000 |
| 200 | 10000 | Januari | 28500 |
| 200 | 500 | Februari | 500 |
| 100 | 500 | Februari | 800 |
| 300 | 700 | Maret | 700 |
| 200 | 700 | Maret | 1100 |
更高效的dplyr实现方式
如果不想用循环,可以借助dplyr按月份分组计算,代码更简洁:
library(dplyr) df1 <- df1 %>% group_by(Period) %>% mutate( Final_Budget = accumulate( .x = 1:n(), .f = function(prev, curr) { if (curr == 1) { budgetv2[curr] } else { budgetv2[curr] + prev - Cost[curr-1] } } ) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者Muhammad Rafif
相关产品推荐
相关产品推荐

