如何创建一个 wave 变量,以考虑到退出并稍后返回面板的受访者?

How to create a wave variable that takes into account respondents who drop and come back later to the panel?

我正在尝试为面板数据创建一个 wave 变量。我遵循了此线程中的建议:Create a sequential number (counter) for rows within each group of a dataframe。这会产生 wave 变量,您可以在下面使用此代码的输出中看到:df = df %>% group_by(id) %>% mutate(wave = row_number()).

但是,此变量的问题在于,当受访者离开小组一段时间然后又回来时,它不会捕获。例如,ID 1 的受访者从 2007 年到 2009 年从面板中下降并在 2010 年返回,使用上述代码的 wave 变量生成 3,而实际上它是 real_wave 变量中所示的 wave 6。有人可以让我知道是否有办法使用 dplyr 在 real_wave 变量中实现输出?

 id year      wave real_wave
    1   2005    1     1
    1   2006    2     2
    1   2010    3     6
    2   2008    1     1
    2   2009    2     2
    2   2012    3     5
    
    structure(list(id = structure(c(1, 1, 1, 2, 2, 2), format.stata = "%9.0g"), 
        year = structure(c(2005, 2006, 2010, 2008, 2009, 2012), format.stata = "%9.0g"), 
        wave = structure(c(1, 2, 3, 1, 2, 3), format.stata = "%9.0g"), 
        real_wave = structure(c(1, 2, 6, 1, 2, 5), format.stata = "%9.0g")), row.names = c(NA, 
    -6L), class = c("tbl_df", "tbl", "data.frame"))

听起来您需要的不是行号,而是每组中第一项的差异(加上一个,因为您从 1 开始计数)。因此:

df <- df %>% group_by(id) %>%
  mutate(wave = year - first(year) + 1)

给予

> df
# A tibble: 6 x 4
# Groups:   id [2]
     id  year  wave real_wave
  <dbl> <dbl> <dbl>     <dbl>
1     1  2005     1         1
2     1  2006     2         2
3     1  2010     6         6
4     2  2008     1         1
5     2  2009     2         2
6     2  2012     5         5