Вот вариант с использованием mapply
out1 <- t(mapply(
function(x, y, z = decline.vector) {
n <- length(z)
c(rep(NA, y), x * z[(y + 1):n])
},
x = volumes,
y = months.passed
))
out1
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#[1,] NA NA 7.29 6.56 5.9 5.31 4.78 4.3 3.87 3.48
#[2,] NA NA NA NA 11.8 10.62 9.56 8.6 7.74 6.96
#[3,] NA NA NA NA NA 5.31 4.78 4.3 3.87 3.48
#[4,] NA NA NA NA NA NA 9.56 8.6 7.74 6.96
Векторизованный вариант, в котором мы используем матричное умножение
out2 <- t(t(volumes)) %*% t(decline.vector)
Далее мы используем матрицу для вставки NA
с в первые months.passed
столбцы для каждой строки
out2[cbind(rep(1:length(months.passed), months.passed),
sequence(months.passed))] <- NA
Результат
identical(out1, out2)
# [1] TRUE
данные
decline.vector <- c(0.9, 0.81, 0.729, 0.656, 0.590, 0.531, 0.478, 0.430, 0.387, 0.348)
volumes <- c(10, 20, 10, 20)
months.passed <- c(2, 4, 5, 6)