Копировать данные столбца, когда функция объединяет одну строку в несколько в R

Мне нужна помощь в подсчете годовой суммы (для каждой из многих инициатив) и разбивке по месяцам с помощью простой формулы деления. Мне нужно сделать это для каждой отдельной комбинации нескольких столбцов при копировании столбцов, разбитых по годовой сумме на каждую месячную сумму. Цикл применяет формулу к двум столбцам и перебирает каждую отдельную группу в векторе. Я попытался объяснить в примере ниже, как это несколько сложно.

Что я имею:

| Init | Name | Date |Total Savings|Total Costs| 
|  A   | John | 2015 |    TotalD   |   TotalD  |
|  A   | Mike | 2015 |    TotalE   |   TotalE  |
|  A   |  Rob | 2015 |    TotalF   |   TotalF  |
|  B   | John | 2015 |    TotalG   |   TotalG  |
|  B   | Mike | 2015 |    TotalH   |   TotalH  |
......
| Init | Name | Date |Total Savings|Total Costs| 
|  A   | John | 2016 |    TotalI   |   TotalI  |
|  A   | Mike | 2016 |    TotalJ   |   TotalJ  |
|  A   |  Rob | 2016 |    TotalK   |   TotalK  |
|  B   | John | 2016 |    TotalL   |   TotalL  |
|  B   | Mike | 2016 |    TotalM   |   TotalM  |

Я собираюсь зациклить функцию для первой строки, чтобы взять "Всего сбережений" и "Всего затрат" и разделить на 12, где Дата = 2015 и 9, где Дата = 2016 (с начала по сентябрь) и создать отдельную строку для каждого, По сути, я выстраиваю итоговую сумму в год и создаю строку для каждого месяца года. Мне нужна помощь в запуске этого цикла, чтобы также скопировать столбцы "Init", "Name", пока комбинация "Init", "Name" не станет разной. Также обратите внимание, что формула для деления на год также будет другой. Я полагаю, что мог бы разделить наборы данных за 2015 и 2016 годы, использовать две разные функции и объединить, если это будет проще. Ниже должен быть вывод:

| Init | Name | Date       |Monthly Savings|Monthly Costs| 
|  A   | John | 01-01-2015 |   TotalD/12*  |   MonthD    |
|  A   | John | 02-01-2015 |    MonthD     |   MonthD    |
|  A   | John | 03-01-2015 |    MonthD     |   MonthD    |
...
|  A   | Mike | 01-01-2016 |    TotalE/9*  |   TotalE    |
|  A   | Mike | 02-01-2016 |    TotalE     |   TotalE    |
|  A   | Mike | 03-01-2016 |    TotalE     |   TotalE    |
...
|  B   | John | 01-01-2015 |   TotalG/12*  |   MonthD    |
|  B   | John | 02-01-2015 |    MonthG     |   MonthD    |
|  B   | John | 03-01-2015 |    MonthG     |   MonthD    |

TotalD / 12 * = MonthD - это формула на 2015 год
TotalE/9* = MonthE - это формула на 2016 год

Любая помощь будет оценена...

1 ответ

Решение

Для начала приведем некоторые воспроизводимые данные с описанными столбцами:

myData <-
  data.frame(
    Init = rep(LETTERS[1:3], each = 4)
    , Name = rep(c("John", "Mike"), each = 2)
    , Date = 2015:2016
    , Savings = (1:12)*1200
    , Cost = (1:12)*2400
  )

Затем установите делитель, который будет использоваться для каждого года:

toDivide <-
  c("2015" = 12, "2016" = 9)

Затем я использую magrittr труба, как я разделить данные на отдельные строки, а затем перебирая их lapply расширить каждую строку на соответствующее количество строк (9 или 12) с экономией и затратами, разделенными на количество месяцев. В заключение, dplyr"s bind_rows сшивает ряды обратно вместе.

myData %>%
  split(1:nrow(.)) %>%
  lapply(function(x){
    temp <- data.frame(
      Init = x$Init
      , Name = x$Name
      , Date = as.Date(paste(x$Date
                           , formatC(1:toDivide[as.character(x$Date)]
                                     , width = 2, flag = "0")
                           , "01"
                           , sep = "-"))
      , Savings = x$Savings / toDivide[as.character(x$Date)]
      , Cost = x$Cost / toDivide[as.character(x$Date)]
    )
  }) %>%
  bind_rows()

head это выглядит так:

    Init Name       Date  Savings      Cost
1      A John 2015-01-01 100.0000  200.0000
2      A John 2015-02-01 100.0000  200.0000
3      A John 2015-03-01 100.0000  200.0000
4      A John 2015-04-01 100.0000  200.0000
5      A John 2015-05-01 100.0000  200.0000
6      A John 2015-06-01 100.0000  200.0000

с похожими записями для каждой расширенной строки.

Другие вопросы по тегам