R中特定年份的条件拟人

时间:2018-05-28 10:56:22

标签: r dplyr data.table

我正在尝试使用以下规则生成条件虚拟变量“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,那么在NA之前的所有两年中,X变量为= 0。如果Y的模式为0,1,NA1,0,NA,则X = 1。需要明确的是,如果1,1,NA那么第一个特定年份的X = 1,它应该只计算一次(X = 1),而不是两次。

我现在拥有的代码(感谢@Auréle,来自我之前的问题here)是我必须生成的代码。

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 :(得分:0)

说实话,这个问题不是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列将值替换为值-1,然后在比较中使用它

  • 当Y == 1时,条件(前一年的Y不是1)也可能导致每组(国家)的第一个记录行(年)出现问题,这就是为什么我也包括这个案例在条件(即(lag(Y_2,1)!=1 | is.na(lag(Y_2,1)))

  • 就像@andrew_reece的评论中提到的那样,你试图获得的模式有很多边缘情况,其中只有一个在上面,其他例子可能是如果Y ==对于某个国家,过去几年中有1个,你会怎么做?

根据您拥有的数据,尝试考虑更明确的条件描述

希望这会有所帮助