Как создать фиктивную переменную после NA в R - PullRequest
0 голосов
/ 26 мая 2018

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

For DV in Data:    
    set: Flag "1" for all NA in DV
    set: Flag "0" otherwise

A образец набора данных указан ниже,

year    country DV
1990    Bahamas 2
1991    Bahamas NA
1992    Bahamas NA
1993    Bahamas 0
1994    Bahamas 1
1995    Bahamas 2
1996    Bahamas NA
1997    Bahamas 2
1998    Bahamas NA
1999    Bahamas 2
2000    Bahamas NA
2001    Bahamas 1
2002    Bahamas NA
2003    Bahamas 1
2004    Bahamas NA
2005    Bahamas 2
2006    Bahamas NA
2007    Bahamas 0
2008    Bahamas 1
2009    Bahamas 2
2010    Bahamas NA
2011    Bahamas 2

Из Правило упомянуто, ясно, что Флаги должны быть установлены, как указано ниже,

year    country DV  Flag
1990    Bahamas 2   0
1991    Bahamas NA  0
1992    Bahamas NA  0
1993    Bahamas 0   1
1994    Bahamas 1   0
1995    Bahamas 2   0
1996    Bahamas NA  0
1997    Bahamas 2   1
1998    Bahamas NA  0
1999    Bahamas 2   1
2000    Bahamas NA  0
2001    Bahamas 1   1
2002    Bahamas NA  0
2003    Bahamas 1   1
2004    Bahamas NA  0
2005    Bahamas 2   1
2006    Bahamas NA  0
2007    Bahamas 0   1
2008    Bahamas 1   0
2009    Bahamas 2   0
2010    Bahamas NA  0
2011    Bahamas 2   1

Для ясности, Флаг устанавливается только наОснова столбца DV независимо от того, что находится после или до DV.

В настоящее время я пытаюсь это сделать: data$Flag <- ave(data$country, data$DV, FUN = function(x) if (max(x) == NA) 1 else 0)

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

Спасибо.

Ответы [ 3 ]

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

Вы можете взять разность логического вектора, полученную с помощью is.na(), и приравнять ее к -1.Это даст вам позиции перехода от NA к не-NA.

cbind(df, Flag = c(0, diff(is.na(df$DV)) == -1))
#    year country DV Flag
# 1  1990 Bahamas  2    0
# 2  1991 Bahamas NA    0
# 3  1992 Bahamas NA    0
# 4  1993 Bahamas  0    1
# 5  1994 Bahamas  1    0
# 6  1995 Bahamas  2    0
# 7  1996 Bahamas NA    0
# 8  1997 Bahamas  2    1
# 9  1998 Bahamas NA    0
# 10 1999 Bahamas  2    1
# 11 2000 Bahamas NA    0
# 12 2001 Bahamas  1    1
# 13 2002 Bahamas NA    0
# 14 2003 Bahamas  1    1
# 15 2004 Bahamas NA    0
# 16 2005 Bahamas  2    1
# 17 2006 Bahamas NA    0
# 18 2007 Bahamas  0    1
# 19 2008 Bahamas  1    0
# 20 2009 Bahamas  2    0
# 21 2010 Bahamas NA    0
# 22 2011 Bahamas  2    1
0 голосов
/ 27 мая 2018

Можно использовать dplyr::lag для проверки предыдущего значения DV, равного NA, и текущей строки non-NA для установки Flag в качестве 1, в противном случае оно будет 0.

library(dplyr)

df %>% mutate(Flag = ifelse(!is.na(DV) & is.na(lag(DV, default = 0)), 1, 0 ))
#    year country DV Flag
# 1  1990 Bahamas  2    0
# 2  1991 Bahamas NA    0
# 3  1992 Bahamas NA    0
# 4  1993 Bahamas  0    1
# 5  1994 Bahamas  1    0
# 6  1995 Bahamas  2    0
# 7  1996 Bahamas NA    0
# 8  1997 Bahamas  2    1
# 9  1998 Bahamas NA    0
# 10 1999 Bahamas  2    1
# 11 2000 Bahamas NA    0
# 12 2001 Bahamas  1    1
# 13 2002 Bahamas NA    0
# 14 2003 Bahamas  1    1
# 15 2004 Bahamas NA    0
# 16 2005 Bahamas  2    1
# 17 2006 Bahamas NA    0
# 18 2007 Bahamas  0    1
# 19 2008 Bahamas  1    0
# 20 2009 Bahamas  2    0
# 21 2010 Bahamas NA    0
# 22 2011 Bahamas  2    1
0 голосов
/ 26 мая 2018

Как насчет

data$X <- 0
data$X[which(is.na(data$DV)) + 1] <- !is.na(data$DV[which(is.na(data$DV)) + 1])
...