Копировать данные столбца, когда функция объединяет одну строку в несколько в 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
с похожими записями для каждой расширенной строки.