如何在 R 中的 NA 之后生成虚拟变量

How to generate a dummy variable after NAs in R

我正在尝试使用以下规则生成虚拟变量,

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

下面给出一个样本数据集

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

需要说明的是,Flag 仅在 DV 列的基础上设置,而不管 DV 之前或之后的内容.

我目前正在尝试: data$Flag <- ave(data$country, data$DV, FUN = function(x) if (max(x) == NA) 1 else 0)

显然这看起来不正确,我知道这一点。这里的任何帮助将不胜感激。

谢谢。

怎么样

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

你可以取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

可以使用 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