在dplyr中按组/时间指示器的滞后变量

时间:2018-09-28 13:45:36

标签: r dplyr

我有如下数据:

set.seed(13)
dt <- data.frame(group = c(rep("a", 3), rep("b", 4), rep("c", 3)), var = c(rep(0.1,3), rep(0.3, 4), rep(1.1,3)))
dt

   group var
1      a 0.1
2      a 0.1
3      a 0.1
4      b 0.3
5      b 0.3
6      b 0.3
7      b 0.3
8      c 1.1
9      c 1.1
10     c 1.1

我想将变量var中的所有受访者的变量group滞后。一个困难是组的大小不同,否则将n指定为所有组的大小就没有问题。我的数据应相应查看(见下文)。例如,如何使用dplyr来解决这个问题?

   group var lag1.var lag2.var
1      a 0.1 NA       NA
2      a 0.1 NA       NA
3      a 0.1 NA       NA
4      b 0.3 0.1      NA
5      b 0.3 0.1      NA
6      b 0.3 0.1      NA
7      b 0.3 0.1      NA
8      c 1.1 0.3      0.1
9      c 1.1 0.3      0.1
10     c 1.1 0.3      0.1

2 个答案:

答案 0 :(得分:0)

您可以为每个组的滞后变量创建一个小标题,然后将其与dt合并。试试这个:

left_join(dt, dt %>%
                  group_by(group) %>%
                  mutate(var = first(var)) %>%
                  distinct() %>%
                  ungroup() %>%
                  mutate(lag1.var = lag(var, order_by = group),
                         lag2.var = lag(lag1.var, order_by = group)) %>%
                  select(-var),
          by = "group")
# output
   group var lag1.var lag2.var
1      a 0.1       NA       NA
2      a 0.1       NA       NA
3      a 0.1       NA       NA
4      b 0.3      0.1       NA
5      b 0.3      0.1       NA
6      b 0.3      0.1       NA
7      b 0.3      0.1       NA
8      c 1.1      0.3      0.1
9      c 1.1      0.3      0.1
10     c 1.1      0.3      0.1

这假设var在每个组中始终相同

答案 1 :(得分:0)

这是另一种选择。首先,我们按组嵌套,然后映射出滞后值,然后进行嵌套。

library(tidyverse)

dt %>% 
  nest(-group) %>% 
  mutate(lag1.var = map_dbl(data, ~.x$var[[1]]) %>% lag(.), lag2.var = lag(lag1.var)) %>%
  unnest
#>    group lag1.var lag2.var var
#> 1      a       NA       NA 0.1
#> 2      a       NA       NA 0.1
#> 3      a       NA       NA 0.1
#> 4      b      0.1       NA 0.3
#> 5      b      0.1       NA 0.3
#> 6      b      0.1       NA 0.3
#> 7      b      0.1       NA 0.3
#> 8      c      0.3      0.1 1.1
#> 9      c      0.3      0.1 1.1
#> 10     c      0.3      0.1 1.1