【问题标题】:How to generate lag variable by year with repeated pid occurrences如何通过重复出现 pid 逐年生成滞后变量
【发布时间】:2020-01-03 02:00:58
【问题描述】:

我的面板数据如下所示。

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 的 lag 都应该具有 A 类型。

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

如果有除了创建滞后变量之外的其他方法来创建typechange,那将非常有帮助。

提前非常感谢您!

【问题讨论】:

    标签: r panel lag


    【解决方案1】:

    这是使用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")
    

    【讨论】:

      猜你喜欢
      • 2018-11-27
      • 2018-12-16
      • 1970-01-01
      • 2012-12-02
      • 2015-11-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多