R 让lag之类的东西与组员一起工作
试图用简化的数据/代码重现我的管道,如下所示:R 让lag之类的东西与组员一起工作,r,R,试图用简化的数据/代码重现我的管道,如下所示: library(magrittr) library(dplyr) library(lubridate) df <- data.frame( date = c( as.Date("2015-1-1") , as.Date("2015-2-1") , as.Date("2015-3-1") , as.Date("2015-4-1") , as.Date("2
library(magrittr)
library(dplyr)
library(lubridate)
df <- data.frame(
date = c(
as.Date("2015-1-1")
, as.Date("2015-2-1")
, as.Date("2015-3-1")
, as.Date("2015-4-1")
, as.Date("2015-5-1")
, as.Date("2015-6-1")
, as.Date("2015-1-1")
, as.Date("2015-2-1")
, as.Date("2015-3-1")
, as.Date("2015-4-1")
, as.Date("2015-5-1")
, as.Date("2015-6-1")
)
,value = c(1,2,3,4,5,6 ,7,8,9,10,11,12)
,category = as.factor(c("cat1","cat1","cat1","cat1","cat1","cat1" ,"cat2","cat2","cat2","cat2","cat2","cat2"))
) %>%
group_by(
date = floor_date(date, unit = "monthly")
,category
) %>%
summarise(
value = min(value)
) %>%
mutate(
month_minus_1 = lag(value, n=1)
, month_minus_2 = lag(value, n=2)
) %>%
arrange(
category
, value
)
df
预期产出:
date category value month_minus_1 month_minus_2
2015-01-01 cat1 1 NA NA
2015-02-01 cat1 2 1 NA
2015-03-01 cat1 3 2 1
2015-04-01 cat1 4 3 2
2015-05-01 cat1 5 4 3
2015-06-01 cat1 6 5 4
2015-01-01 cat2 7 NA NA
2015-02-01 cat2 8 7 NA
2015-03-01 cat2 9 8 7
2015-04-01 cat2 10 9 8
2015-05-01 cat2 11 10 9
2015-06-01 cat2 12 11 10
简而言之,
date
不应位于dplyr::group_by()
内
dplyr::group_by()
创建单独的迷你数据帧。这些帧的功能类似于dplyr::lag()。所以基本上你是用一行创建了12个data.frames
库(magrittr)
图书馆(dplyr)
图书馆(lubridate)
数据帧(
日期=截止日期(c)(
"2015-01-01", "2015-02-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-06-01",
"2015-01-01", "2015-02-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-06-01"
)),
值=c(1,2,3,4,5,6,7,8,9,10,11,12),
类别=等效系数(c(“cat1”、“cat1”、“cat1”、“cat1”、“cat1”、“cat1”、“cat1”、“cat1”、“cat2”、“cat2”、“cat2”、“cat2”、“cat2”))
) %>%
组别(类别)%>%
变异(
月减1=滞后(值,n=1,订单日期),
月减去2=滞后(值,n=2,顺序=日期)
) %>%
解组()
结果:
#一个tible:12 x 5
日期值类别月份\u减\u 1个月\u减\u 2
1 2015-01-01 1 cat1 NA NA
2 2015-02-01第1类不适用
3 2015-03-01第3类
4 2015-04-01 4 cat1 3 2
5 2015-05-01 5 cat1 4 3
6 2015-06-01 6 cat1 5 4
7 2015-01-01 7第2类不适用
8 2015-02-01 8 cat2 7 NA
9 2015-03-01 9第2类8 7
10 2015-04-01 10第2类9 8
11 2015-05-01 11第2类10 9
12 2015-06-01 12第2类11 10
我看到您想要在真实场景中总结一些东西(而不是您在这里介绍的简化场景)。我会这样做,在对滞后进行子集划分之前,计算地板和统计数据。第一个dplyr::ungroup()
不是必需的,但我喜欢它更好地传达意图的方式
data.frame(
日期=截止日期(c)(
"2015-01-01", "2015-02-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-06-01",
"2015-01-01", "2015-02-01", "2015-03-01", "2015-04-01", "2015-05-01", "2015-06-01"
)),
值=c(1,2,3,4,5,6,7,8,9,10,11,12),
类别=等效系数(c(“cat1”、“cat1”、“cat1”、“cat1”、“cat1”、“cat1”、“cat1”、“cat1”、“cat2”、“cat2”、“cat2”、“cat2”、“cat2”))
) %>%
dplyr::突变(
月\楼=楼\日(日期,单位=“月”)
) %>%
分组(类别、月份和楼层)%>%
总结(
value_mean=mean(value)#或您所指的汇总统计。
) %>%
解组()%>%
组别(类别)%>%
变异(
月减去月1=滞后(值平均值,n=1,顺序=月底),
月减去月2=滞后(值平均值,n=2,顺序=月底)
) %>%
解组()
汇总
删除一个分组“层”。因此,在总结之后,您只有一个按date
分组的df,而您需要一个按类别分组的df
只需切换两个分组变量即可满足您的需要:
库(magrittr)
图书馆(dplyr)
图书馆(lubridate)
df%>%
分组(类别),
日期=楼层日期(日期,单位=“每月”)
) %>%
汇总(值=最小值))%>%
突变(月数减去1=滞后(值,n=1),
月-2=滞后(值,n=2))%>%
安排(分类),
价值)
#>#tibble:12 x 5
#>#群体:类别[2]
#>类别日期值月\减\ 1个月\减\ 2
#>
#>1 cat1 2015-01-01 1 NA
#>2 cat1 2015-02-01 2 1 NA
#>3 cat1 2015-03-01 3 2 1
#>4 cat1 2015-04-01 4 3 2
#>5 cat1 2015-05-01 5 4 3
#>6 cat1 2015-06-01 6 5 4
#>7 cat2 2015-01-01 7 NA
#>8 cat2 2015-02-01 8 7 NA
#>9第2类2015-03-01 9 8 7
#>10第二类2015-04-01 10 9 8
#>11第2类2015-05-01 11 10 9
#>12第2类2015-06-01 12 11 10
由(v0.3.0)于2020年4月3日创建。请提供您的预期输出。@DarrenTsai-抱歉,我认为这是显而易见的…谢谢。这很有效。我一点也不知道秩序有多重要!我不确定我是否能接受你的第一个答案——看看下面wibeasley说了些什么……这完全一样,也许不那么明确,但我认为更清楚。它确实考虑到了你想要做的任何总结,这是非常公平的。但是,当应用于rollmean+rollmedian时,这不起作用。我知道这不是问题所在。但是,显式方法是有效的。所以不确定你说的是不是可以推广的?太棒了-我对rollmean+RollMiddian也有类似的问题
date category value month_minus_1 month_minus_2
2015-01-01 cat1 1 NA NA
2015-02-01 cat1 2 1 NA
2015-03-01 cat1 3 2 1
2015-04-01 cat1 4 3 2
2015-05-01 cat1 5 4 3
2015-06-01 cat1 6 5 4
2015-01-01 cat2 7 NA NA
2015-02-01 cat2 8 7 NA
2015-03-01 cat2 9 8 7
2015-04-01 cat2 10 9 8
2015-05-01 cat2 11 10 9
2015-06-01 cat2 12 11 10