计算每月的动态月份

时间:2018-07-31 07:41:27

标签: r

我正在尝试使用R计算数据行上的月与月%收入变化。例如,我当前的数据是:

MoM((Revenue_month2-Revenue_month1)/Revenue_month1)*100) 

我想在R中创建一个动态函数来计算收入

 Month     Revenue_MoM 
 April         3% 
   May        -8% 
  June         50% 

任何新月份。

输出应类似于:

UPDATE `system` 
                JOIN System AS Sys ON service.Servicename_ID = Sys.FK_Service_ID 
                JOIN Hardware ON System.System_ID = Hardware.FK_System_ID
                JOIN Verantwortlichkeit ON System.System_ID = Verantwortlichkeit.FK_System_ID
                JOIN Zertifikate ON System.System_ID = Zertifikate.FK_System_ID
                JOIN hardware_servername ON hardware.Servername = hardware_servername.Servername_ID
                JOIN hardware_domaene ON hardware_domaene.Domaene_ID = hardware.Domaene
                JOIN hardware_betriebssystem ON hardware_betriebssystem.Betriebssystem_ID =             hardware.Betriebssystem
                JOIN hardware_standort ON hardware_standort.Standort_ID = hardware.Standort
                JOIN verantwortlichkeit_personen AS AA ON AA.Verantwortlichkeit_Personen_ID = system.Hersteller
                JOIN verantwortlichkeit_personen AS AB ON AB.Verantwortlichkeit_Personen_ID = system.Externer_Partner
                JOIN system_verfuegbarkeitsstufe ON system_verfuegbarkeitsstufe.Verfuegbarkeitsstufe_ID = system.Verfuegbarkeitsstufe
                JOIN system_systemname ON system_systemname.Systemname_ID = system.Systemname
                JOIN system_systemnummer ON system_systemnummer.Systemnummer_ID = system.Systemnummer
                JOIN verantwortlichkeit_rolle ON verantwortlichkeit_rolle.Verantwortlichkeit_Rolle_ID = verantwortlichkeit.Rolle
                JOIN verantwortlichkeit_personen AS A0 ON A0.Verantwortlichkeit_Personen_ID = verantwortlichkeit.Hauptverantwortlicher
                JOIN verantwortlichkeit_personen AS A1 ON A1.Verantwortlichkeit_Personen_ID = verantwortlichkeit.Stellvertretung
                JOIN verantwortlichkeit_personen AS A2 ON A2.Verantwortlichkeit_Personen_ID = verantwortlichkeit.Wissenstraeger_1
                JOIN verantwortlichkeit_personen AS A3 ON A3.Verantwortlichkeit_Personen_ID = verantwortlichkeit.Wissenstraeger_2
                JOIN verantwortlichkeit_personen AS A4 ON A4.Verantwortlichkeit_Personen_ID = verantwortlichkeit.Verantwortlichkeit_extern
                SET 
                Sys.Systemnummer = '1', 
                Sys.Systembeschreibung = 'testbeschreubuzng', 
                Sys.Hersteller = 'Okan Koc', 
                Sys.Externer_Partner = 'Okan Koc', 
                Sys.`BKAG_Brugg` = b'1', 
                Sys.`BCIAG_Brugg` = b'1', 
                Sys.`Cables_Diverse_PL_CN_US_DE` = b'1', 
                Sys.`BINF` = b'1', 
                Sys.`BRAG_Kleindoettingen` = b'1', 
                Sys.`BRG_Wunstorf` = b'1', 
                Sys.`BGP_Nordhausen` = b'1', 
                Sys.`Pipes_Diverse_FR_PL_IT_US` = b'1', 
                Sys.`Ropes_BDAG_Birr` = b'1', 
                Sys.`HOLDING_Brugg` = b'1', 
                Sys.`BIAG_Brugg` = b'1', 
                Sys.`BPK_Brugg` = b'1', 
                Sys.`Dritte_Schule_Brugg_LithCom_usw` = b'1', 
                Sys.`Verfuegbarkeitsstufe` = '1', 
                Sys.`Datenverlust` = '1', 
                Sys.`Systemname` = 'Testsystem', 
                hardware.`Servername` = 'srvntstest',
                hardware.`Domaene` = 'cables.bruggnet.com',
                hardware.`Betriebssystem` = 'Windows Server 2012 R2',
                hardware.`Lokale_Datenbank` = '1',
                hardware.`Datenbank_SQL_Master` = 'SQLTEST',
                hardware.`Instanzname` = 'Testinstanz',
                hardware.`Standort` = 'RZ 1',
                hardware.`Backup_mit` = 'Veeam',

                verantwortlichkeit.`Rolle` = 'Systemtechnik',
                verantwortlichkeit.`Hauptverantwortlicher` = 'David Grunder',
                verantwortlichkeit.`Stellvertretung` = 'Robin Gloor',
                verantwortlichkeit.`Wissenstraeger_1` = 'Okan Koc',
                verantwortlichkeit.`Wissenstraeger_2` = 'Marc Gerber',
                verantwortlichkeit.`Verantwortlichkeit_extern` = 'infor',
                zertifikate.`Zertifikatname` = 'testzertifikat',
                zertifikate.`Ablaufdatum` = '27.12.2001'

                WHERE Sys.System_ID = 1

,依此类推。

1 个答案:

答案 0 :(得分:0)

我有一个data.table解决方案,只需将月份设置为适当的日期函数,就可以固定顺序。但是它应该给您一个想法。请记住,第一个月无法计算增长率。我使用对数增长率,我认为这是最好的方法,但是您可以轻松地将其转换为任何其他增长率计算。

  library(data.table)
  dt <- structure(list(Booking.Date = structure(c(1L, 1L, 1L, 2L, 2L, 
                                            2L, 3L, 3L, 3L), .Label = c("4/1/2018", "5/8/2018", "6/30/2018"
                                            ), class = "factor")
                 , Revenue = c(3160L, 12656L, 5157L, 12152L,  2824L, 4600L, 6936L, 17298L, 9625L)
                 , Month = structure(c(1L, 1L, 1L, 3L, 3L, 3L, 2L, 2L, 2L), .Label = c("April", "June", "May"), class = "factor"))
                , row.names = c(NA, -9L)
            , class = c("data.table","data.frame"))
  # Change the month column into date one
  # Setting the locale, so that the months can be converted
  Sys.setlocale("LC_TIME", "en_US.UTF-8")
  dt[, `:=`(Month.Date = as.Date(paste0("2018-",Month,"-01"), tryFormats = "%Y-%B-%d"))
  dt[,.(Sum.Revenue = sum(Revenue)), by = list(Month.Date)][, .(Month.Date
                                                     , Sum.Revenue
                                                     , Change.Revenue = log(Sum.Revenue) - log(shift(Sum.Revenue, n =1L, type = "lag"))
                                                                                               )]
 # Calculations, based on the normal growth rate calculation
 dt[,.(Sum.Revenue = sum(Revenue)), by = list(Month.Date)][, .(Month.Date
                                                     , Sum.Revenue
                                                     , Change.Revenue = (Sum.Revenue - shift(Sum.Revenue, n =1L, type = "lag"))/shift(Sum.Revenue, n =1L, type = "lag")
                                                                                               )]