#r
#r
Вопрос:
У меня есть фрейм данных, и некоторые столбцы имеют значения NA. Кроме того, данные несбалансированы (т.е. идентификаторы относятся к разным годам). Я пытаюсь создать фиктивную переменную (в R) для последовательных (в течение многих лет) повторяющихся значений по идентификатору группы.
В качестве примера у меня есть data.frame:
data <- data.frame(Year = c(1980, 1981, 1982, 1983, 1984, 1990, 1991, 1992, 1993,
1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995),
ID = c(1,1,1,1,1, 2,2,2,2, 3,3,3,3,3,3,3,3,3),
value=c(0,0,0,NA,1, 0,1,0,1, NA,NA,0,0,0,0,1,0,0))
Year ID value
1 1980 1 0
2 1981 1 0
3 1982 1 0
4 1983 1 NA
5 1984 1 1
6 1990 2 0
7 1991 2 1
8 1992 2 0
9 1993 2 1
10 1987 3 NA
11 1988 3 NA
12 1989 3 0
13 1990 3 0
14 1991 3 0
15 1992 3 0
16 1993 3 1
17 1994 3 0
18 1995 3 0
Меня интересует новая переменная, скажем, «фиктивная», которая равна нулю, если в течение 3 или более лет подряд значение переменной «value» равно нулю, NA, если значение равно NA, и остальное единица.
Например, в 1980-1982 годах для первого идентификатора он должен быть равен нулю, иначе 1 или NA соответственно.
Что меня интересует, так это:
Year ID value dummy
1 1980 1 0 0
2 1981 1 0 0
3 1982 1 0 0
4 1983 1 NA NA
5 1984 1 1 1
6 1990 2 0 1
7 1991 2 1 1
8 1992 2 0 1
9 1993 2 1 1
10 1987 3 NA NA
11 1988 3 NA NA
12 1989 3 0 0
13 1990 3 0 0
14 1991 3 0 0
15 1992 3 0 0
16 1993 3 1 1
17 1994 3 0 1
18 1994 5 0 1
Кто-нибудь может мне помочь?
Ответ №1:
Вы можете использовать dplyr для группировки ваших данных по идентификатору, сортировки ваших данных по идентификатору и году для создания новой переменной. Фиктивная переменная будет равна единице тогда и только тогда, когда значение (этого года для этого человека) и значение за год до и за год до этого равны нулю. Соответственно, ID1 в 1982 году имеет фиктивное значение 0 в этом примере.
library(dplyr)
data %>%
group_by(ID) %>%
arrange(ID, Year) %>% ## sort by ID and year
mutate(dummy =
case_when(
value == 0 amp; lag(value, n = 1) == 0 amp; lag(value, n = 2) == 0 ~ 0, ## 3 consec years
is.na(value) ~ value, ## if value is NA
TRUE ~ 1 ) ## 1 otherwise
)
# A tibble: 18 x 4
# Groups: ID [3]
Year ID value dummy
<dbl> <dbl> <dbl> <dbl>
1 1980 1 0 1
2 1981 1 0 1
3 1982 1 0 0
4 1983 1 NA NA
5 1984 1 1 1
6 1990 2 0 1
7 1991 2 1 1
8 1992 2 0 1
9 1993 2 1 1
10 1987 3 NA NA
11 1988 3 NA NA
12 1989 3 0 1
13 1990 3 0 1
14 1991 3 0 0
15 1992 3 0 0
16 1993 3 1 1
17 1994 3 0 1
18 1995 3 0 1
Комментарии:
1. Это было очень полезно. Спасибо!