Условный манекен для определенных лет в R - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь сгенерировать условную фиктивную переменную "X" со следующим правилом

set X=1 if Y is =1, two years prior to the NA.
In other words, X=1/0 depending on [0/1=year1,0/1=year2,NA]. 

Например, как показано ниже, если шаблон для Y равен 0,0,NA, тогда переменная X равна =0 за все два года до NA. Если шаблон для Y равен 0,1,NA или 1,0,NA, то X = 1. Для ясности, если 1,1,NA, то X = 1 в тот первый конкретный год, он должентолько считать один раз (X = 1), а не дважды.

Код, который у меня есть сейчас (спасибо @ Auréle, из моего предыдущего вопроса здесь ), наиболее близок к тому, чтобы его сгенерировать.

dat2 <- dat1 %>% 
  group_by(country) %>% 
  group_by(grp = cumsum(is.na(lag(Y))), add = TRUE) %>% 
  mutate(first_year_at_1 = match(1, Y) * any(is.na(Y)) * any(tail(Y, 3) == 1L), 
         X = {x <- integer(length(Y)) ; x[first_year_at_1] <- 1L ; x}) %>% 
  ungroup()

Однако на самом деле это не дает того, что я описал выше. Любая помощь здесь будет принята с благодарностью.

Ниже вы можете увидеть мои примеры данных с желаемым результатом »X«Дурак в нем.

data <- structure(list(year = c(1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 
1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 
2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 1990L, 1991L, 1992L, 
1993L, 1994L, 1995L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 
2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 
2011L, 1990L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L, 
1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 
2007L, 2008L, 2009L, 2010L, 2011L, 1990L, 1991L, 1992L, 1993L, 
1994L, 1995L, 1996L, 1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 
2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 
1990L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L, 1998L, 
1999L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 
2007L, 2008L, 2009L, 2010L, 2011L), country = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("Canada", 
"Cuba", "Dominican Republic", "Haiti", "Jamaica"), class = "factor"), 
    Y = c(1L, NA, 1L, 1L, 1L, NA, 1L, NA, 1L, NA, 1L, NA, 1L, 
    1L, NA, 1L, NA, 1L, NA, 1L, NA, NA, 1L, 1L, NA, NA, 1L, NA, 
    1L, NA, 1L, NA, 1L, 1L, 1L, 1L, NA, 1L, NA, 1L, NA, 1L, NA, 
    NA, 1L, NA, 1L, 0L, 0L, 0L, 1L, NA, 0L, 1L, 0L, 0L, 0L, 0L, 
    0L, 1L, NA, 0L, 1L, 1L, NA, 0L, 1L, NA, 1L, NA, 1L, NA, 1L, 
    NA, 1L, NA, 1L, 1L, 1L, 1L, NA, 1L, NA, 1L, NA, 1L, NA, 1L, 
    0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, NA, 0L, 1L, 1L, 1L, 
    NA, 1L, NA, 0L, 1L, 1L, NA), X = c(1L, 0L, 0L, 1L, 0L, 0L, 
    1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 
    0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 
    0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 
    1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 
    1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-110L))

1 Ответ

0 голосов
/ 29 мая 2018

Если честно, вопрос не на 100% ясен, но я подумал, что смогу дать ему шанс, вот так:

data_new <- data_1 %>% 
  mutate(Y_2 = ifelse(is.na(Y), -1, Y)) %>% 
  group_by(country) %>% 
  mutate(X_2 = ifelse((Y_2==1 & 
                         lead(Y_2, 1) == -1 & 
                         (lag(Y_2,1)!=1 | is.na(lag(Y_2,1)))) | 
                        (Y_2==1 & lead(Y_2, 2) == -1 ), 
                      1, 0))

В основном я сформулировал условие следующим образом:

X равно 1 в двух случаях:

  • , если Y == 1, а Y через два года равно NA

  • или если (Y== 1) и (Y в следующем году - NA) и (Y в предыдущем году - не 1)

Пара примечаний:

  • Поскольку мы не можем использовать NA в сравнениях, я использовал столбец Y_2 для замены NA значением -1, а затем использовал его в сравнении

  • Условие (Yна предыдущий год не 1) также может вызвать проблемы в первой записанной строке (году) каждой группы (страны), когда Y == 1, поэтому я включил этот случай также в условие (то есть (lag(Y_2,1)!=1 | is.na(lag(Y_2,1))))

  • Как упомянуто в комментарии @andrew_reece, шаблон, который вы пытаетесь получить, имеет множество крайних случаев, только один из которых находится в приведенном выше пункте, другой пример может быть, еслиY == 1 за последние пару лет для какой-то страны, как бы вы справились с этим?

Попробуйте рассмотреть более подробное описание ваших состояний на основе имеющихся у вас данных

надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...