Изменения кодирования в переменных в R - PullRequest
0 голосов
/ 26 апреля 2020

Я работаю с данными, которые выглядят так:

   ID Year Variable_of_Interest
1   a 2000                   0
2   a 2001                   0
3   a 2002                   0
4   a 2003                   0
5   a 2004                   0
6   a 2005                   1
7   a 2006                   1
8   a 2007                   1
9   a 2008                   1
10  a 2009                   1
11  b 2000                   0
12  b 2001                   0
13  b 2002                   0
14  b 2003                   1
15  b 2004                   1
16  b 2005                   1
17  b 2006                   1
18  b 2007                   1
19  b 2008                   1
20  b 2009                   1
21  c 2000                   0
22  c 2001                   0
23  c 2002                   0
24  c 2003                   0
25  c 2004                   0
26  c 2005                   0
27  c 2006                   1
28  c 2007                   1
29  c 2008                   1
30  c 2009                   1
31  d 2000                   0
32  d 2001                   0
33  d 2002                   1
34  d 2003                   1
35  d 2004                   1
36  d 2005                   1
37  d 2006                   0
38  d 2007                   0
39  d 2008                   0
40  d 2009                   0

Единицей анализа является ID. Идентификаторы повторяются в каждом году в данных. Столбец variable of interest представляет изменения идентификаторов, причем в некоторых годах они равны 0, а в других годах они равны 1

Я хочу создать дополнительный столбец, который кодирует изменения (определяемые как переход от 0 до 1) в Variable_of_Interest в год до и после изменения, а также игнорируя изменения с (1 до 0) (как видно, когда идентификатор равен «d»).

Любой код, который может помочь мне достичь этого решения, был бы очень признателен!

Перфекционность Я бы хотел, чтобы данные выглядели так:

   ID Year Variable_of_Interest Solution
1   a 2000                   0       -5
2   a 2001                   0       -4
3   a 2002                   0       -3
4   a 2003                   0       -2
5   a 2004                   0       -1
6   a 2005                   1        0
7   a 2006                   1        1
8   a 2007                   1        2
9   a 2008                   1        3
10  a 2009                   1        4
11  b 2000                   0       -3
12  b 2001                   0       -2
13  b 2002                   0       -1
14  b 2003                   1        0
15  b 2004                   1        1
16  b 2005                   1        2
17  b 2006                   1        3
18  b 2007                   1        4
19  b 2008                   1        5
20  b 2009                   1        6
21  c 2000                   0       -6
22  c 2001                   0       -5
23  c 2002                   0       -4
24  c 2003                   0       -3
25  c 2004                   0       -2
26  c 2005                   0       -1
27  c 2006                   1        0
28  c 2007                   1        1
29  c 2008                   1        2
30  c 2009                   1        3
31  d 2000                   0       -2
32  d 2001                   0       -1
33  d 2002                   1        0
34  d 2003                   1        1
35  d 2004                   1        2
36  d 2005                   1        3
37  d 2006                   0       NA
38  d 2007                   0       NA
39  d 2008                   0       NA
40  d 2009                   0       NA

Вот код репликации:

ID <- c(rep("a",10), rep("b", 10), rep("c", 10), rep("d", 10)); length(ID)
Year <- rep(seq(2000,2009, 1), 4)
Variable_of_Interest <- c(rep(0,5), rep(1, 5), 
                         rep(0,3), rep(1, 7), 
                         rep(0,6), rep(1, 4),
                         rep(0,2), rep(1, 4), rep(0,4))


data.frame(ID, Year, Variable_of_Interest)

Спасибо за помощь!

1 Ответ

1 голос
/ 26 апреля 2020

Мы могли бы создать функцию:

library(dplyr)

get_sequence <- function(x) {
  inds <- which(x == 1 & lag(x) == 0)[1]
  vals <- seq_along(x) - inds
  inds <- which(x == 0 & lag(x) == 1)[1]
  if(!is.na(inds))  vals[inds:length(x)] <- NA
  return(vals)
}

и применить ее для каждого ID:

df %>% group_by(ID) %>% mutate(Solution = get_sequence(Variable_of_Interest)) 

#   ID Year Variable_of_Interest Solution
#1   a 2000                    0       -5
#2   a 2001                    0       -4
#3   a 2002                    0       -3
#4   a 2003                    0       -2
#5   a 2004                    0       -1
#6   a 2005                    1        0
#7   a 2006                    1        1
#8   a 2007                    1        2
#9   a 2008                    1        3
#10  a 2009                    1        4
#11  b 2000                    0       -3
#...
#...
#33  d 2002                    1        0
#34  d 2003                    1        1
#35  d 2004                    1        2
#36  d 2005                    1        3
#37  d 2006                    0       NA
#38  d 2007                    0       NA
#39  d 2008                    0       NA
#40  d 2009                    0       NA
...