Внутри цикла вы должны поместить столбцы в строку, над которой вы работаете (строка i
) для данной итерации цикла.В противном случае вы выполняете присваивание для всего столбца каждый раз, а не только для одной строки.Кроме того, создание A и D не обязательно должно быть в цикле.
df$A <- c(0, 0.25, 0.50, 0.75, 1.00)
for(i in 1:nrow(df)){
df$B[i] <- ifelse(df$A[i] == 0, 0, df$C[i-1])
df$C[i] <- df$A[i]*df$B[i] + 1
}
df$D <- df$C + 5
Вы также можете сделать это, используя Reduce
, но нет единого мнения о том, что это лучше, и многиелюди скажут, что использование Reduce
с accumulate = T
хуже, чем просто использование цикла
df$A <- c(0, 0.25, 0.50, 0.75, 1.00)
df[, c('B', 'C')] <-
do.call(rbind,
Reduce(function(x, A) (A != 0)*x[2]*c(1, A) + 0:1,
df$A, init = c(0, 0), accumulate = T))[-1,]
df$D <- df$C + 5