计算不同年份当天之间价值的变化

时间:2017-04-14 11:28:00

标签: r mat

我需要计算所谓的MAT(Movie Anual Total),意味着两个不同年份当天销售价值的百分比变化:

    ID Sales Day Month Year
    A  500   31  12   2015
    A  100   1    1   2016
    A  200   2    1   2016

    ...      
    A  200   1    1   2017

有没有人知道如何处理它?<​​/ p>

我想得到这个:

ID Sales Day Month Yeas **MAT**

2 个答案:

答案 0 :(得分:0)

根据您的数据设置方式,您实际上非常接近。您现在要做的是按月和日对数据进行分组,按年度对每个组进行排序,然后采用连续的差异(假设您希望MAT连续几年)

library(lubridate)
library(dplyr)
X <- 
  data.frame(date = seq(as.Date("2014-01-01"), 
                        as.Date("2017-12-31"), 
                        by = 1)) %>%
  mutate(day = day(date),
         month = month(date),
         year = year(date),
         sales = rnorm(nrow(.), mean = 100, sd = 5))

X %>%
  group_by(month, day) %>%
  arrange(month, day, year) %>%
  mutate(mat = c(NA, diff(sales))) %>%
  ungroup()

如果您希望能够在任何两年之间一直保持差异,则需要进行一些改进。

答案 1 :(得分:0)

以下是基础R的解决方案。主要是自我加入:

d$prev.Year <- d$Year-1
dd <- merge(d,d, by.x=c("prev.Year", "Month", "Day"), by.y=c("Year", "Month", "Day"))
dd$MAT <- with(dd, (Sales.x-Sales.y)/Sales.y)

如果您在ID中有不同的值,则最终需要:

dd <- merge(d,d, by.x=c("ID", "prev.Year", "Month", "Day"), by.y=c("ID", "Year", "Month", "Day"))

数据:

d <- read.table(header=TRUE, text=
"ID Sales Day Month Year
A  500   31  12   2015
A  100   1    1   2016
A  200   2    1   2016
A  200   1    1   2017")