如何通过重复出现的 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 个条目)
我决定为 type
和 type.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
,听听会很有帮助。
非常感谢您!
这是使用 dplyr
和 tidyr::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")
我有如下所示的面板数据。
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 个条目)
我决定为 type
和 type.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
,听听会很有帮助。
非常感谢您!
这是使用 dplyr
和 tidyr::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")