如何在 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
我正在尝试使用以下规则生成虚拟变量,
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