r语言 - Dplyr滞后于汇总分组数据



使用dplyr,我希望将新的数据列总结为分组数据的现有列的滞后版本。

Reprex:

dateidx <- as.Date(c("2019-01-02", "2019-01-032", "2019-01-02", "2019-01-07", "2019-01-07", "2019-01-07", "2019-01-10", "2019-01-10"))
A <- c(100, 100, 200, 200, 200, 300, 400, 135)
B <- c(1500, 2000, 1350, 780, 45, 200, 150, 250)
test.df1 <- data.frame(dateidx, A, B)
> test.df1
dateidx   A    B
1 2019-01-02 100 1500
2 2019-01-03 100 2000
3 2019-01-02 200 1350
4 2019-01-07 200  780
5 2019-01-07 200   45
6 2019-01-07 300  200
7 2019-01-10 400  150
8 2019-01-10 135  250

目的:

>dateidx <- c("2019-01-02","2019-01-03", "2019-01-07", "2019-01-10")
> sumA <- c(300, 100, 700, 535)
> sumAlag <- c(NA, 300, 100, 700)
> meanB <- c(1425, 2000, 342, 200)
> meanBlag <- c(NA, 1425, 2000, 342)
> test.obj <- data.frame (dateidx2, sumA, sumAlag, meanB, meanBlag)
> test.obj
dateidx sumA sumAlag meanB meanBlag
1 2019-01-02  300      NA  1425       NA
2 2019-01-03  100     300  2000     1425
3 2019-01-07  700     100   342     2000
4 2019-01-10  535     700   200      342
我代码:

test.df2 <- test.df1 %>%
group_by(dateidx) %>%
summarise (
sumA = sum(A), 
sumAlag = lag(sumA),
meanB = mean(B), 
meanBlag =dplyr::lag(meanB)
)

所需结果:

dateidx sumA sumAlag meanB meanBlag
1 2019-01-02  300      NA  1425       NA
2 2019-01-03  100     300  2000     1425
3 2019-01-07  700     100   342     2000
4 2019-01-10  535     700   200      342

实际结果:

> test.df2
# A tibble: 4 × 5
dateidx     sumA sumAlag meanB meanBlag
<date>     <dbl>   <dbl> <dbl>    <dbl>
1 2019-01-02   300      NA 1425        NA
2 2019-01-03   100      NA 2000        NA
3 2019-01-07   700      NA  342.       NA
4 2019-01-10   535      NA  200        NA

尝试修复:

消歧(如dplyr/plyr:: mutate问题)

创建虚拟变量

使用"order-by"重新指定分组

多年前修复的dplyr错误

来源:

https://dplyr.tidyverse.org/reference/lead-lag.html:但未讨论分组

https://dplyr.tidyverse.org/reference/lead-lag.html:仅在一阶粒度上领先或滞后

dplyr: lead()和lag()在与group_by()一起使用时出错:关于确保延迟消除歧义:其他不相关的问题

分组数据的滞后函数:for python

dplyr跨组滞后:显式滞后而不是群体内部

你想先用summarise得到和和均值,然后你可以用mutate语句得到每列的滞后,然后重新排列这些列。

library(tidyverse)
test.df2 <- test.df1 %>%
group_by(dateidx) %>%
summarise(sumA = sum(A),
meanB = mean(B)) %>%
mutate(sumAlag = lag(sumA),
meanBlag = lag(meanB)) %>% 
select(dateidx, starts_with("sum"), starts_with("mean"))

dateidx     sumA sumAlag meanB meanBlag
<date>     <dbl>   <dbl> <dbl>    <dbl>
1 2019-01-02   300      NA 1425       NA 
2 2019-01-03   100     300 2000     1425 
3 2019-01-07   700     100  342.    2000 
4 2019-01-10   535     700  200      342.

最新更新