【问题标题】:How to create conditional dummies "before the event" with dplyr in R?如何在 R 中使用 dplyr “在事件发生前”创建条件假人?
【发布时间】:2018-05-27 20:34:03
【问题描述】:

我正在尝试使用规则创建条件虚拟 (X)

如果在 NA 之前的最后两年 Y=1,则设置 X=1(只计算一次!)。

举个例子:这是我数据中的一个样本:

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

下面是 X 虚拟模型的外观:

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

这对我来说有点太复杂了。我一直在阅读 dplyr 这似乎是一个相关的包here。到目前为止,我的阅读将我带到了这条鳕鱼

df %>% mutate(X=ifelse(Y >0) & lag(Y,2,))

我得到错误:

缺少参数“yes”,没有默认值

请告诉我我在这里做错了什么。我也应该把“ifelse”放在“滞后”之前吗?

谢谢。

【问题讨论】:

  • 您能否解释一下X1 列是如何创建的?我还不清楚逻辑。
  • X=1 如果 Y 在 NA 之前的最后两年中 =1。例如:1996 年,Y 拥有 NA。那么,过去两年(例如 1994 年和 1995 年)的 Y 变量值是否为 1?是的,在 1994 年 - 因此 X==1 在 1994 年。
  • 如果我们有 2000 年的 NA,那么 1998 年和 1999 年的 Y =0,那么 1998 年和 1999 年的 X 应该 =0。但如果我们在 1998 年或 1999 年(即 NA 前两年)有,那么那年 X 将 ==1。
  • 我意识到这并不容易解释。在我开始写下来之前,一切在我脑海中都是有意义的。如果您还有其他问题,请告诉我。
  • 对不起@Goulou,你要找的模式还不清楚。是0, 0, NA吗?你能指定你正在寻找的模式吗?

标签: r dplyr data.table plyr


【解决方案1】:

可以使用dplyr 包找到解决方案。方法是创建一个以NA 结尾的组。然后first 行与具有Y == 1 的组和该组的last Y 为NA 然后x1 设置为1 否则X1 将设置为0

library(dplyr)

df %>% group_by(Grp = cumsum(is.na(lag(Y))))  %>%
  mutate(X1 = ifelse(row_number()== min(which(Y==1)) & is.na(last(Y)) , 1, 0 )) %>%
  ungroup() %>%
  select(-Grp) %>%
  as.data.frame()


#    year country  Y X1
# 1  1990 Bahamas  1  1
# 2  1991 Bahamas NA  0
# 3  1992 Bahamas NA  0
# 4  1993 Bahamas  0  0
# 5  1994 Bahamas  1  1
# 6  1995 Bahamas  1  0
# 7  1996 Bahamas NA  0
# 8  1997 Bahamas  1  1
# 9  1998 Bahamas NA  0
# 10 1999 Bahamas  1  1
# 11 2000 Bahamas NA  0
# 12 2001 Bahamas  1  1
# 13 2002 Bahamas  1  0
# 14 2003 Bahamas  0  0
# 15 2004 Bahamas NA  0
# 16 2005 Bahamas  0  0
# 17 2006 Bahamas  0  0
# 18 2007 Bahamas  1  1
# 19 2008 Bahamas NA  0
# 20 2009 Bahamas  1  0
# 21 2010 Bahamas  1  0
# 22 2011 Bahamas  1  0
# 
# 

数据:

df <- read.table(text = 
"year    country Y
1990    Bahamas 1
1991    Bahamas NA
1992    Bahamas NA
1993    Bahamas 0
1994    Bahamas 1
1995    Bahamas 1
1996    Bahamas NA
1997    Bahamas 1
1998    Bahamas NA
1999    Bahamas 1
2000    Bahamas NA
2001    Bahamas 1
2002    Bahamas 1
2003    Bahamas 0
2004    Bahamas NA
2005    Bahamas 0
2006    Bahamas 0
2007    Bahamas 1
2008    Bahamas NA
2009    Bahamas 1
2010    Bahamas 1
2011    Bahamas 1",
header = TRUE, stringsAsFactors = FALSE)

【讨论】:

    【解决方案2】:
    library(dplyr)
    
    dat <- readr::read_table(
    "year    country Y
    1990    Bahamas 1
    1991    Bahamas NA
    1992    Bahamas NA
    1993    Bahamas 0
    1994    Bahamas 1
    1995    Bahamas 1
    1996    Bahamas NA
    1997    Bahamas 1
    1998    Bahamas NA
    1999    Bahamas 1
    2000    Bahamas NA
    2001    Bahamas 1
    2002    Bahamas 1
    2003    Bahamas 0
    2004    Bahamas NA
    2005    Bahamas 0
    2006    Bahamas 0
    2007    Bahamas 1
    2008    Bahamas NA
    2009    Bahamas 1
    2010    Bahamas 1
    2011    Bahamas 1
    ")
    
    expected_output <- readr::read_table(
    "year    country Y   X1
    1990    Bahamas 1   1
    1991    Bahamas NA  0
    1992    Bahamas NA  0
    1993    Bahamas 0   0
    1994    Bahamas 1   1
    1995    Bahamas 1   0
    1996    Bahamas NA  0
    1997    Bahamas 1   1
    1998    Bahamas NA  0
    1999    Bahamas 1   1
    2000    Bahamas NA  0
    2001    Bahamas 1   1
    2002    Bahamas 1   0
    2003    Bahamas 0   0
    2004    Bahamas NA  0
    2005    Bahamas 0   0
    2006    Bahamas 0   0
    2007    Bahamas 1   1
    2008    Bahamas NA  0
    2009    Bahamas 1   0
    2010    Bahamas 1   0
    2011    Bahamas 1   0
    ")
    

    识别以NA 结尾的组,在Y 列中找到第一个1 的位置,在找到的位置创建X1 列,1s:

    res <-
      dat %>% 
      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), 
             X1 = {x <- integer(length(Y)) ; x[first_year_at_1] <- 1L ; x}) %>% 
      ungroup()
    
    all.equal(select(res, -grp, -first_year_at_1), expected_output)
    
    # [1] TRUE
    

    (注意:如果真实数据集中有不同的国家,您可能需要先按country 分组,以避免在国家交界处产生不良影响。我相应地编辑了我的答案。

    【讨论】:

    • 我收到这个“错误:禁止分配”
    • packageVersion("dplyr") 是什么? (我的是0.7.4。如果你的版本较早,可以用install.packages("dplyr")更新吗?)
    • 用真实数据。我看不出我提供的样本和我拥有的真实数据之间的模式有什么区别
    • 版本 0.4.3。立即升级
    • @Goulou 查看我的编辑,我添加了* any(tail(Y, 3) == 1L)
    猜你喜欢
    • 2016-05-10
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2020-08-16
    相关资源
    最近更新 更多