Как я могу создать фиктивную переменную над последовательными значениями по идентификатору группы?

#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. Это было очень полезно. Спасибо!