Я хочу найти амортизацию с помощью colSums - PullRequest
0 голосов
/ 06 марта 2020

У меня есть таблица (назовем ее development.costs), как показано ниже:

1 2 3 4
4 5 6 7
8 9 1 2

Каждый столбец представляет год.

Я хочу создать еще одну таблицу (назовем ее depreciation.costs) с такими же размерами, чтобы: в каждой строке каждый элемент каждого столбца был равен:

         0.4*[(Sum of all elements of that row of the development.costs table up until the year of the element) - (Sum of all elements of that row of the depreciation.costs table up until one year before)]

поэтому я хочу создать таблицу

ab c d
efgh
ijkl

такую, что, например, c = 0,4 * [(1 + 2) +3) - (a + b)]

код, который мне удалось написать:

for (y in Years)
{depreciation.costs[y, ] <- 0.4*(colSums(development.costs[1:y], )-colSums(depreciation.costs[1:(y-1), ]))}

где Years <- 1: 4 </p>

, но это неверно, поскольку система выдает мне ошибку

Ошибка в colSums (depreciation.rate [, 1: (y - 1)]): 'x' должен быть массивом как минимум из двух измерений

много спасибо за любой отзыв

1 Ответ

2 голосов
/ 06 марта 2020

Это похоже на алгоритм, который вы описываете, хотя из вашего описания трудно сказать, какими должны быть значения в первом столбце.

Вот ваши данные в матричной форме:

dev_costs <- t(matrix(c(1:4, 4:7, 8:9,  1:2), nrow = 4))
dev_costs
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    2    3    4
#> [2,]    4    5    6    7
#> [3,]    8    9    1    2

Мы можем легко составить кумулятивную сумму строк следующим образом:

cum_dev <- t(apply(dev_costs, 1, cumsum))

Затем итеративное l oop для завершения алгоритма:

answer <- cum_dev
for(i in seq(ncol(cum_dev))[-1])
{
  answer[,i] <- 0.4 * (cum_dev[,i] - rowSums(answer[,1:(i-1), drop = FALSE]))
}

Давая нам

answer
#>      [,1] [,2] [,3]  [,4]
#> [1,]    1  0.8 1.68 2.608
#> [2,]    4  2.0 3.60 4.960
#> [3,]    8  3.6 2.56 2.336

Создано в 2020-03-06 пакетом Представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...