如何在 R 中使用 dplyr 创建条件虚拟对象 "before the event"?
How to create conditional dummies "before the event" with dplyr in R?
我正在尝试使用规则
创建条件虚拟 (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 的信息,这似乎是一个相关的包。到目前为止,我的阅读已将我带到这条鳕鱼
df %>% mutate(X=ifelse(Y >0) & lag(Y,2,))
我收到错误:
argument "yes" is missing, with no default
请告诉我我做错了什么。我是否也应该将 "ifelse" 放在 "lag" 之前?
谢谢。
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
结尾的组,找到第一个1
在Y
列中的位置,创建X1
列1
s 在找到的位置:
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
分组,以避免在国家交界处产生不良影响。我相应地编辑了我的答案).
可以使用 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)
我正在尝试使用规则
创建条件虚拟 (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 的信息,这似乎是一个相关的包。到目前为止,我的阅读已将我带到这条鳕鱼
df %>% mutate(X=ifelse(Y >0) & lag(Y,2,))
我收到错误:
argument "yes" is missing, with no default
请告诉我我做错了什么。我是否也应该将 "ifelse" 放在 "lag" 之前?
谢谢。
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
结尾的组,找到第一个1
在Y
列中的位置,创建X1
列1
s 在找到的位置:
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
分组,以避免在国家交界处产生不良影响。我相应地编辑了我的答案).
可以使用 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)