2016-10-31 5 views
2

У меня есть набор данных, где у меня есть годовые итоговые значения для определенных значений, хранящихся в одной строке (наблюдение). Я хотел бы упорядочить данные в R, чтобы эта общая строка разбивалась на каждый месяц с использованием простого уравнения (total/12), в котором годовая сумма делится на 12 в каждой из 12 строк в виде ежемесячной суммы. Я пытаюсь сделать это в R, но очень новичок и не совсем уверен, с чего начать. Пример ниже:Перерыв суммированной строки в отдельные строки в R

Date | Total 
 
2015 | 12,000 
 

 
Some R function to convert to: 
 

 
    Date | Total 
 
01-01-2015 | 1,000 
 
02-01-2015 | 1,000 
 
03-01-2015 | 1,000

+0

Приносим извинения за неправильное посадку в стол ... Новичок в stackoverflow. – CGermain

+0

У вас есть метка MySQL. Получают ли данные из базы данных? – Parfait

ответ

0

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

myData <- 
    data.frame(
    Date = 2011:2015 
    , Total = (1:5)*1200 
) 

Затем я разделить data.frame вверх по столбцу Date (это предполагает, что эти годы уникальны), зациклившись на lapply, чтобы внести изменения в нужные вам месячные значения, затем сшили их вместе с bind_rows от dplyr (также необходимо загрузить dplyr или magrittr для труб (%>%) для работы).

myData %>% 
    split(.$Date) %>% 
    lapply(function(x){ 
    temp <- data.frame(
     Date = as.Date(paste(x$Date 
          , formatC(1:12, width = 2, flag = "0") 
          , "01" 
          , sep = "-")) 
     , Total = x$Total/12 
    ) 
    }) %>% 
    bind_rows() 

дает (примечание, используя ... для обозначения пропущенных строк)

  Date Total 
1 2011-01-01 100 
2 2011-02-01 100 
3 2011-03-01 100 
... 
16 2012-04-01 200 
17 2012-05-01 200 
18 2012-06-01 200 
... 
29 2013-05-01 300 
30 2013-06-01 300 
31 2013-07-01 300 
... 
43 2014-07-01 400 
44 2014-08-01 400 
45 2014-09-01 400 
... 
58 2015-10-01 500 
59 2015-11-01 500 
60 2015-12-01 500 

Если, как это было предложено в комментариях, вы должны разделить различным числом месяцев каждый год, я бы создать вектор разделов, названных в течение лет. Здесь я использую dplyr для n_distinct и трубу magrittr, чтобы облегчить назначение общего случая. Затем добавить/изменить запись на другой год:

toDivide <- 
    rep(12, n_distinct(myData$Date)) %>% 
    setNames(sort(unique(myData$Date))) 

toDivide["2016"] <- 9 

Тогда вместо 12, как указано выше, вы можете использовать этот вектор. Так, замените это:

Total = x$Total/12 

в петле lapply, с этим:

Total = x$Total/toDivide[as.character(x$Date)] 

и он должен разделить вхождением на этот год, а не всегда деления на одно и то же.

+0

Большое спасибо! Я дам вам попытку и дам вам знать, как это работает. – CGermain

+0

Марк, это сработало хорошо. Я добавил предложение group by, поскольку у меня было несколько строк с итогами, которые нужно было сгруппировать по дополнительным размерам. У меня возникли дополнительные вопросы. У меня 2015 год, который мне нужно разделить на 12, а затем на 2016 год, который мне нужно разделить на 9 (через септ), где бы я поставил оператор «if», чтобы сказать, если Date = 2016, тогда разделите его на 9? – CGermain

+0

Рад, что это сработало для вас. См. Edit для примера, который должен работать для того, что вам нужно. –