我正在尝试使用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
,依此类推。
答案 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")
)]