#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')