dplyr 滞后函数多重嵌套数据

dplyr lag function multiple nested data

我想为嵌套在三组中的值创建滞后变量:

例如:

df <- data.frame(wave = c(1,1,1,1,1,1,2,2,2,2,2,2),
                 party = rep(c("A", "A", "A", "B", "B", "B"), 2),
                 inc = rep(c(1,2,3), 4), 
                 value = c(1, 10, 100, 3, 30, 300, 6, 60, 600, 7, 70, 700)) 

数据:

   wave party inc value
1     1     A   1     1
2     1     A   2    10
3     1     A   3   100
4     1     B   1     3
5     1     B   2    30
6     1     B   3   300
7     2     A   1     6
8     2     A   2    60
9     2     A   3   600
10    2     B   1     7
11    2     B   2    70
12    2     B   3   700

我需要的是:

   wave party inc value lag
1     1     A   1     1  NA
2     1     A   2    10  NA
3     1     A   3   100  NA
4     1     B   1     3  NA
5     1     B   2    30  NA
6     1     B   3   300  NA
7     2     A   1     6   1
8     2     A   2    60  10
9     2     A   3   600 100
10    2     B   1     7   3
11    2     B   2    70  30
12    2     B   3   700 300

如果第 2 波中 A 方收入组 (inc) 1 的受访者具有第 1 波中的 inc 1、A 方等的滞后值

我试过了:

df %>% group_by(wave) %>% mutate(lag = lag(value))

这给了我:

    wave party   inc value   lag
   <dbl> <chr> <dbl> <dbl> <dbl>
 1     1 A         1     1    NA
 2     1 A         2    10     1
 3     1 A         3   100    10
 4     1 B         1     3   100
 5     1 B         2    30     3
 6     1 B         3   300    30
 7     2 A         1     6    NA
 8     2 A         2    60     6
 9     2 A         3   600    60
10     2 B         1     7   600
11     2 B         2    70     7
12     2 B         3   700    70

我试过了:

df %>% group_by(party, wave) %>% mutate(lag = lag(value))

这给了我:

    wave party   inc value   lag
   <dbl> <chr> <dbl> <dbl> <dbl>
 1     1 A         1     1    NA
 2     1 A         2    10     1
 3     1 A         3   100    10
 4     1 B         1     3    NA
 5     1 B         2    30     3
 6     1 B         3   300    30
 7     2 A         1     6    NA
 8     2 A         2    60     6
 9     2 A         3   600    60
10     2 B         1     7    NA
11     2 B         2    70     7
12     2 B         3   700    70

我试过了:

df %>% group_by(party, wave, inc) %>% mutate(lag = lag(value))

这给了我:

    wave party   inc value   lag
   <dbl> <chr> <dbl> <dbl> <dbl>
 1     1 A         1     1    NA
 2     1 A         2    10    NA
 3     1 A         3   100    NA
 4     1 B         1     3    NA
 5     1 B         2    30    NA
 6     1 B         3   300    NA
 7     2 A         1     6    NA
 8     2 A         2    60    NA
 9     2 A         3   600    NA
10     2 B         1     7    NA
11     2 B         2    70    NA
12     2 B         3   700    NA

我可以继续这样。我使用 df %>% arrange() 和 order_by() 函数尝试了不同的版本。但出于某种原因,我无法弄清楚如何获得正确的滞后变量。

您可以通过仅按 partyinc 分组来实现您想要的结果:

library(dplyr)

df <- data.frame(wave = c(1,1,1,1,1,1,2,2,2,2,2,2),
                 party = rep(c("A", "A", "A", "B", "B", "B"), 2),
                 inc = rep(c(1,2,3), 4), 
                 value = c(1, 10, 100, 3, 30, 300, 6, 60, 600, 7, 70, 700))

df %>% 
  group_by(party, inc) %>% 
  mutate(lag = lag(value)) %>% 
  ungroup()
#> # A tibble: 12 x 5
#>     wave party   inc value   lag
#>    <dbl> <chr> <dbl> <dbl> <dbl>
#>  1     1 A         1     1    NA
#>  2     1 A         2    10    NA
#>  3     1 A         3   100    NA
#>  4     1 B         1     3    NA
#>  5     1 B         2    30    NA
#>  6     1 B         3   300    NA
#>  7     2 A         1     6     1
#>  8     2 A         2    60    10
#>  9     2 A         3   600   100
#> 10     2 B         1     7     3
#> 11     2 B         2    70    30
#> 12     2 B         3   700   300