不使用包循环基于前一行计算数组行的代码问题排查
你的R代码问题分析与修正
咱们一步步拆解你代码里的问题,然后给出能得到预期结果的写法:
主要错误点
语法错误:
for (i in 1:nrow(df){这里缺少闭合的右括号,正确写法是for (i in 1:nrow(df)) {df$C<-df$A*df$B)+1多了一个右括号,正确的表达式是df$C <- df$A * df$B + 1
逻辑与赋值错误:
- 你把整列赋值(比如
df$A<-c(0, 0.25, 0.50, 0.75, 1.00))放在循环里,这会在每次循环重复覆盖整列,既没必要也违背了逐行依赖前一行的计算逻辑。 - 计算
B时直接写C[i-1],没有指定是df$C,而且当i=1时i-1=0会触发索引越界错误。 - 没有先初始化第一行的基础值,第一行没有前一行,必须手动设置初始条件才能让后续循环正常运行。
- 你把整列赋值(比如
修正后的代码
# 初始化数据框 df <- data.frame(matrix(ncol = 4, nrow = 5)) names(df) <- c("A", "B", "C", "D") # 提前给A列赋值,无需放在循环内 df$A <- c(0.00, 0.25, 0.50, 0.75, 1.00) # 手动初始化第一行的B、C、D(无前置行可依赖) df$B[1] <- 0.00 df$C[1] <- df$A[1] * df$B[1] + 1 df$D[1] <- df$C[1] + 5 # 从第二行开始循环,每一行依赖前一行的C值计算 for (i in 2:nrow(df)) { df$B[i] <- df$C[i-1] # 前一行的C作为当前行的B df$C[i] <- df$A[i] * df$B[i] + 1 df$D[i] <- df$C[i] + 5 } # 查看结果(可加round(df, 2)得到和预期一致的小数位数) df
运行后输出的精确结果为:
A B C D 1 0.00 0.0000 1.000000 6.000000 2 0.25 1.0000 1.250000 6.250000 3 0.50 1.2500 1.625000 6.625000 4 0.75 1.6250 2.218750 7.218750 5 1.00 2.2188 3.218750 8.218750
如果需要和你预期的四舍五入结果一致,只需在最后执行round(df, 2)即可。
内容的提问来源于stack exchange,提问作者Sthln
相关产品推荐
相关产品推荐

