如何按年生成重复pid的滞后变量

我的面板数据如下所示。

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. / p>

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

如果除了创建滞后变量以创建typechange以外,还有其他方法,那对您很有帮助。

非常感谢您!

liuyf320 回答:如何按年生成重复pid的滞后变量

这是使用lagdplyr中的tidyr::fill的一种方式

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,10002L,10003L,10003L),year = c(2012L,2012L,2013L,2014L,2015L,2016L,2016L),type = structure(c(1L,1L,2L,3L,3L),.Label = c("A","B","C"),class = "factor"),occurrence = c(1L,5L,6L,7L,6L)),row.names = c(NA,-24L),class = "data.frame")
本文链接:https://www.f2er.com/2827246.html

大家都在问