我需要计算所谓的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**
答案 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")