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