在 R 中创建一个 'survival' 虚拟对象(面板数据)

creating a 'survival' dummy in R (panel data)

我想在我的不平衡面板中创建一个虚拟变量,如果该公司明年没有关闭(在这种情况下,我关闭意味着它没有在下一个时间段内记录),则该虚拟变量等于 0,否则为 1 .

我的数据是这样的:

firm_id year 
1        90  
1        92
2        90
2        92
2        94
2        96
3        90

所以我想要的输出看起来像:

firm_id year dummy
1        90   1
1        92   0
2        90   1
2        92   1
2        94   1
2        96   1
3        90   0

我不确定如何解决这个问题,我最初的想法是计算与每个公司相关的年数 firm_id 然后如果公司有 4 年,则始终分配 1,如果公司有 3 years 分配前 2 年 1 和 3rd 年 0,但后来我发现我有公司后来进入小组,所以这种方法不起作用。有没有更好的方法可以解决这个问题?

如果它是公司 ID 的最后一个条目并且不等于当年的最大值,则将值 0 分配给 dummy

df$dummy <- 1
df$dummy[!duplicated(df$firm_id, fromLast = TRUE) & df$year != max(df$year)] <- 0
df

#  firm_id year dummy
#1       1   90     1
#2       1   92     0
#3       2   90     1
#4       2   92     1
#5       2   94     1
#6       2   96     1
#7       3   90     0

这要求您的数据像示例中那样按年份排序。如果没有排序可以先用order排序。

df <- df[with(df, order(firm_id, year)), ]

数据

df <- structure(list(firm_id = c(1L, 1L, 2L, 2L, 2L, 2L, 3L), year = c(90L, 
92L, 90L, 92L, 94L, 96L, 90L)), class = "data.frame", row.names = c(NA, -7L))

我们可以使用

library(dplyr)
df %>%
    mutate(dummy = +(duplicated(firm_id, fromLast = TRUE) | year == max(year)))
  firm_id year dummy
1       1   90     1
2       1   92     0
3       2   90     1
4       2   92     1
5       2   94     1
6       2   96     1
7       3   90     0

数据

df <-  structure(list(firm_id = c(1L, 1L, 2L, 2L, 2L, 2L, 3L), year = c(90L, 
92L, 90L, 92L, 94L, 96L, 90L)), class = "data.frame", row.names = c(NA, -7L))