【问题标题】:How to generate a dummy variable after NAs in R如何在R中的NAs之后生成一个虚拟变量
【发布时间】:2018-05-26 07:26:18
【问题描述】:

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

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

从提到的规则可以看出,Flags 的设置如下所示,

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)

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

谢谢。

【问题讨论】:

  • 最简单的是dat$flag <- as.integer(is.na(dat$DV))

标签: r dplyr data.table plyr


【解决方案1】:

怎么样

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

【讨论】:

    【解决方案2】:

    可以使用dplyr::lag 来检查DV 的先前值是NA,当前行是non-NAFlag 设置为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
    

    【讨论】:

    • 运行代码Error: data_frames can only contain 1d atomic vectors and lists时出现此错误。
    • 我可能会提到我为数据中的多个变量执行此操作:df$Flag&lt;–df %&gt;% mutate(Flag = ifelse(!is.na(DV) &amp; is.na(lag(DV, default = 0)), 1, 0 ))
    • @Goulou 你提到了两件事。 1:- 代码不适合你。 2:- 你想为超过 1 个变量做这件事。对于1st,您能否确认您正在尝试使用 data.frame。第二,如果您告诉我如何应用此规则的列数和标准,那么我可以提供帮助。是否要为超过 1 列生成Flag1Flag2 等?
    • 我解决了。从我这边看,这是一个愚蠢的错误。我还有一个问题,有点类似。感谢您的建议!
    【解决方案3】:

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

    【讨论】:

    • 或者你可以无缘无故加载包并编写两次代码。
    猜你喜欢
    • 2012-08-10
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    相关资源
    最近更新 更多