Распределение затрат по количеству лет по клиенту - PullRequest
0 голосов
/ 13 марта 2019

У меня есть набор данных

dt <- data.table(Customer = c("a", "a", "c"), months = c(12, 24, 37), Date = c("2019-02-23","2019-03-31","2019-10-01"), Cost = c("100","200","370"))

Я хочу разбить затраты по годам и повторить клиента (по номеру строки)

dt$years<- ceiling(dt$months/12)
new.months <- ifelse(dt$months%%dt$years==0,dt$years,dt$years+1)

dt %>% mutate(Date = as.Date(Date), rn = row_number()) %>% 
  slice(rep(row_number(), ceiling(new.months))) %>%
  group_by(Customer, rn) %>%
  mutate(Date = seq(first(Date), by="1 year", length.out=n()))

Я получаю следующий вывод

 Customer months Date       Cost  years    rn
  <chr>     <dbl> <date>     <chr> <dbl> <int>
1 a            12 2019-02-23 100    1        1
2 a            24 2019-03-31 200    2        2
3 a            24 2020-03-31 200    2        2
4 c            37 2019-10-01 370    3.08     3
5 c            37 2020-10-01 370    3.08     3
6 c            37 2021-10-01 370    3.08     3
7 c            37 2022-10-01 370    3.08     3

Тем не менее, желаемый вывод разбил бы столбец затрат, как показано ниже:

  <chr>     <dbl> <date>     <chr> <dbl> <int>
1 a            12 2019-02-23 100    1        1
2 a            24 2019-03-31 100    2        2
3 a            24 2020-03-31 100    2        2
4 c            37 2019-10-01 120    3.08     3
5 c            37 2020-10-01 120    3.08     3
6 c            37 2021-10-01 120    3.08     3
7 c            37 2022-10-01  10    3.08     3

Буду признателен за любую помощь.

Спасибо.

1 Ответ

0 голосов
/ 14 марта 2019

months_to_year функция разбивает целое число n на ячейки по 12 с.Например, months_to_year(37) дает '12 12 12 1'

months_to_year <- function(n){
  if(n%%12==0) y <- rep(12, n %/%  12) else y <- c(rep(12, n %/%  12), n %% 12)
  return(y)
}

Опираясь на ваш код,

dt$years<- dt$months/12
dt$Cost <- as.numeric(dt$Cost)
dt %>% mutate(Date = as.Date(Date), rn = row_number()) %>% 
  slice(rep(rn, ceiling(months/12)))%>%
  group_by(Customer, rn) %>%
  mutate(months1 = months_to_year(first(months)),
         Date = seq(first(Date), by="1 year", length.out=n()),
         Cost = Cost/months * months1)

## A tibble: 7 x 7
## Groups:   Customer, rn [3]
#  Customer months Date        Cost years    rn months1
#  <chr>     <dbl> <date>     <dbl> <dbl> <int>   <dbl>
#1 a            12 2019-02-23   100  1        1      12
#2 a            24 2019-03-31   100  2        2      12
#3 a            24 2020-03-31   100  2        2      12
#4 c            37 2019-10-01   120  3.08     3      12
#5 c            37 2020-10-01   120  3.08     3      12
#6 c            37 2021-10-01   120  3.08     3      12
#7 c            37 2022-10-01    10  3.08     3       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...