2016-11-01 7 views
-1

Мне нужна помощь в принятии годового итога (по каждой из многих инициатив) и разбивка на каждый месяц с использованием простой формулы разделения. Мне нужно сделать это для каждой отдельной комбинации нескольких столбцов при копировании вниз по столбцам, которые разбиты с годового числа на каждый ежемесячный итог. Цикл применит формулу к двум столбцам и процитирует каждую отдельную группу в векторе. Я попытался объяснить в приведенном ниже примере, поскольку он несколько сложный.Копировать данные столбца, когда функция деагрегации одной строки в несколько в 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, где Date = 2015 и 9, где Date = 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
Тотала/9 * = МОНТ - это формула для 2016

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

ответ

0

в качестве начала, вот некоторые воспроизводимые данные с колонки описаны:

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 

с аналогичными записями для каждого расширенного ряда.

+0

Спасибо @Mark. К сожалению, этот пример упростил представление моего фактического кадра данных. Так как у меня более 40 различных значений «init» и разных значений «name» (не всегда повторяющихся), я надеюсь перезапустить цикл каждый раз, когда есть отдельная комбинация «Init» == «Name». – CGermain

+0

Что значит «перезапустить петлю»? Вы пытаетесь разбить каждую строку (годовую сводку) на 9/12 строк (ежемесячная разбивка) или есть ли еще какая-то часть, которую мне не хватает? Это разделяет каждую строку, независимо от значений init/name. –

+0

Я пытаюсь разбить годовую сводку на 9/12 строк для каждого годового резюме, где «Инициал» и «Имя» являются той же комбинацией, что и их изменение в различные комбинации. Как я уже упоминал, существует около 40 различных значений «Init» (это имена инициалов проекта) и 10 значений «Name» (это имена делений). Каждый «Init» будет иметь несколько отчетов «Название» (depts), поэтому мне нужно вырваться на ежемесячную экономию и затраты для всех различных комбинаций инициатив и делений, сохраняя при этом каждую ежемесячную экономию/себестоимость. Это имеет смысл? – CGermain