Заполните единицами ниже первого совпадения с номером для каждого идентификатора

#r

#r

Вопрос:

У меня есть панельная структура данных с 32 идентификаторами и наблюдениями за период с 1980 по 2010 год. Это выглядит примерно так (только с идентификаторами 1 и 2).

 dput(a)
structure(list(id = c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L), year = c(1980, 1980, 1981, 1981, 1982, 1982, 
1983, 1983, 1984, 1984, 1985, 1985, 1986, 1986, 1987, 1987, 1988, 
1988, 1989, 1989, 1990, 1990, 1991, 1991, 1992, 1992, 1993, 1993, 
1994, 1994, 1995, 1995, 1996, 1996, 1997, 1997, 1998, 1998, 1999, 
1999, 2000, 2000, 2001, 2001, 2002, 2002, 2003, 2003, 2004, 2004, 
2005, 2005, 2006, 2006, 2007, 2007, 2008, 2008, 2009, 2009, 2010, 
2010), year_t = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA)), out.attrs = list(dim = 32:31, dimnames = list(Var1 = c("Var1= 1", 
"Var1= 2", "Var1= 3", "Var1= 4", "Var1= 5", "Var1= 6", "Var1= 7", 
"Var1= 8", "Var1= 9", "Var1=10", "Var1=11", "Var1=12", "Var1=13", 
"Var1=14", "Var1=15", "Var1=16", "Var1=17", "Var1=18", "Var1=19", 
"Var1=20", "Var1=21", "Var1=22", "Var1=23", "Var1=24", "Var1=25", 
"Var1=26", "Var1=27", "Var1=28", "Var1=29", "Var1=30", "Var1=31", 
"Var1=32"), Var2 = c("Var2=1980", "Var2=1981", "Var2=1982", "Var2=1983", 
"Var2=1984", "Var2=1985", "Var2=1986", "Var2=1987", "Var2=1988", 
"Var2=1989", "Var2=1990", "Var2=1991", "Var2=1992", "Var2=1993", 
"Var2=1994", "Var2=1995", "Var2=1996", "Var2=1997", "Var2=1998", 
"Var2=1999", "Var2=2000", "Var2=2001", "Var2=2002", "Var2=2003", 
"Var2=2004", "Var2=2005", "Var2=2006", "Var2=2007", "Var2=2008", 
"Var2=2009", "Var2=2010"))), class = "data.frame", row.names = c(NA, 
-62L))**
 

В столбце «year_t» указано «1» в год, когда каждый человек начал «лечение». Итак, для id = 1 мне нужно, чтобы year_t содержал 1 начиная с 1992 года (2010), а для id = 2 мне нужно 1 начиная с 1986 года. Каждый идентификатор может начать лечение в другой год

Я действительно понятия не имею, как это сделать. Заранее спасибо!

Ответ №1:

Работает ли это:

 library(dplyr)
df %>% arrange(id, year) %>% group_by(id) %>% 
mutate(year_t = case_when(between(row_number(), which.min(year_t == 1), n()) ~ 1, TRUE ~ NA_real_))

# A tibble: 62 x 3
# Groups:   id [2]
      id  year year_t
   <int> <dbl>  <dbl>
 1     1  1980     NA
 2     1  1981     NA
 3     1  1982     NA
 4     1  1983     NA
 5     1  1984     NA
 6     1  1985     NA
 7     1  1986     NA
 8     1  1987     NA
 9     1  1988     NA
10     1  1989     NA
11     1  1990     NA
12     1  1991     NA
13     1  1992      1
14     1  1993      1
15     1  1994      1
16     1  1995      1
17     1  1996      1
18     1  1997      1
19     1  1998      1
20     1  1999      1
21     1  2000      1
22     1  2001      1
23     1  2002      1
24     1  2003      1
25     1  2004      1
26     1  2005      1
27     1  2006      1
28     1  2007      1
29     1  2008      1
30     1  2009      1
31     1  2010      1
32     2  1980     NA
33     2  1981     NA
34     2  1982     NA
35     2  1983     NA
36     2  1984     NA
37     2  1985     NA
38     2  1986      1
39     2  1987      1
40     2  1988      1
41     2  1989      1
42     2  1990      1
43     2  1991      1
44     2  1992      1
45     2  1993      1
46     2  1994      1
47     2  1995      1
48     2  1996      1
49     2  1997      1
50     2  1998      1
51     2  1999      1
52     2  2000      1
53     2  2001      1
54     2  2002      1
55     2  2003      1
56     2  2004      1
57     2  2005      1
58     2  2006      1
59     2  2007      1
60     2  2008      1
61     2  2009      1
62     2  2010      1
 

Ответ №2:

Вы можете использовать fill для каждого id :

 a %>% dplyr::group_by(id) %>% tidyr::fill(year_t, .direction = 'down')