如何通过重复出现的 pid 按年生成滞后变量

How to generate lag variable by year with repeated pid occurrences

我有如下所示的面板数据。

pid   year type  occurrence 
10001 2012 A     1
10001 2012 A     2
10001 2013 B     5
10001 2013 B     3
10001 2013 B     2
10001 2014 A     1
10001 2014 A     5
10001 2014 A     3
10002 2012 B     2
10002 2012 B     1
10002 2012 B     6
10002 2013 B     3
10002 2013 B     2
10002 2013 B     7
10003 2012 B     2
10003 2012 B     1
10003 2012 B     6
10003 2014 B     3
10003 2014 B     2
10003 2015 B     2
10003 2015 B     5
10003 2015 B     2
10003 2016 B     3
10003 2016 B     6

我想创建一个变量,指示每个 pid 的类型是否在这些年来发生了变化,使得

pid   year type  occurrence typechange
10001 2012 A     1          NA
10001 2012 A     2          NA
10001 2013 B     5          "A->B"
10001 2013 B     3          "A->B"
10001 2013 B     2          "A->B"
10001 2014 A     1          "B->A"
10001 2014 A     5          "B->A"
10001 2014 A     3          "B->A"

我尝试循环遍历所有 pid 和年份以跟踪更改,但很快意识到代码对于我的小笔记本电脑来说运行速度太慢了。 (数据集约 200,000 个条目)

我决定为 typetype.lag1 创建滞后变量,然后比较两者以创建 typechange 变量,但遇到了障碍。

预期的滞后变量应如下所示:

pid   year type  occurrence type.lag1 
10001 2012 A     1          NA
10001 2012 A     2          NA
10001 2013 B     5          A
10001 2013 B     3          A
10001 2013 B     2          A
10001 2014 A     1          B
10001 2014 A     5          B
10001 2014 A     3          B
10002 2012 B     2          NA
10002 2012 B     1          NA
10002 2012 B     6          NA
10002 2013 B     3          B
10002 2013 B     2          B
10002 2013 B     7          B
10003 2012 B     2          NA
10003 2012 B     1          NA
10003 2012 B     6          NA
10003 2014 A     3          B
10003 2014 A     2          B
10003 2015 B     2          A
10003 2015 B     5          A
10003 2015 B     2          A
10003 2016 C     3          B
10003 2016 C     6          B

滞后变量应该是这样的,对于每个 pid,如果 2012 年的类型是 A,那么在接下来的 2013 年(如果缺少 2013 年,那么在 2014 年或之后),所有 pid 的滞后都应该是 A 类型.

很多时候,每年都会出现3个pid,但并不能保证。在某些情况下,某些年份也会丢失。那么滞后应该从前一年(可能不是连续的)获得值。

如果除了创建滞后变量之外还有其他方法来创建typechange,听听会很有帮助。

非常感谢您!

这是使用 dplyrtidyr::fill

中的 lag 的一种方法
library(dplyr)
df %>%
  arrange(pid, year) %>%
  group_by(pid) %>%
  mutate(type.lag1 = replace(lag(type), year == lag(year, default = first(year)), 
                             NA)) %>%
  tidyr::fill(type.lag1) 

#     pid year type occurrence type.lag1
#1  10001 2012    A          1      <NA>
#2  10001 2012    A          2      <NA>
#3  10001 2013    B          5         A
#4  10001 2013    B          3         A
#5  10001 2013    B          2         A
#6  10001 2014    A          1         B
#7  10001 2014    A          5         B
#8  10001 2014    A          3         B
#9  10002 2012    B          2      <NA>
#10 10002 2012    B          1      <NA>
#11 10002 2012    B          6      <NA>
#12 10002 2013    B          3         B
#13 10002 2013    B          2         B
#14 10002 2013    B          7         B
#15 10003 2012    B          2      <NA>
#16 10003 2012    B          1      <NA>
#17 10003 2012    B          6      <NA>
#18 10003 2014    A          3         B
#19 10003 2014    A          2         B
#20 10003 2015    B          2         A
#21 10003 2015    B          5         A
#22 10003 2015    B          2         A
#23 10003 2016    C          3         B
#24 10003 2016    C          6         B

数据

df <- structure(list(pid = c(10001L, 10001L, 10001L, 10001L, 10001L, 
10001L, 10001L, 10001L, 10002L, 10002L, 10002L, 10002L, 10002L, 
10002L, 10003L, 10003L, 10003L, 10003L, 10003L, 10003L, 10003L, 
10003L, 10003L, 10003L), year = c(2012L, 2012L, 2013L, 2013L, 
2013L, 2014L, 2014L, 2014L, 2012L, 2012L, 2012L, 2013L, 2013L, 
2013L, 2012L, 2012L, 2012L, 2014L, 2014L, 2015L, 2015L, 2015L, 
2016L, 2016L), type = structure(c(1L, 1L, 2L, 2L, 2L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L), .Label = c("A", "B", "C"), class = "factor"), occurrence = c(1L, 
2L, 5L, 3L, 2L, 1L, 5L, 3L, 2L, 1L, 6L, 3L, 2L, 7L, 2L, 1L, 6L, 
3L, 2L, 2L, 5L, 2L, 3L, 6L)), row.names = c(NA, -24L), class = "data.frame")