如何在活动开始前制作有条件的假人""与Rp中的dplyr?

时间:2018-05-27 20:34:03

标签: r dplyr data.table plyr

我尝试使用规则

创建一个条件虚拟(X)

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

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

bfg --replace-text passwords.txt

以下是X假人的样子:

$(this).attr('href').replace("&location=100", "&location=loc");

对我来说这有点太复杂了。我一直在阅读关于dplyr的内容,这似乎是一个相关的包。到目前为止,我的读数已经把我带到了这个鳕鱼

$(this).attr('href').replace("&location=100", "&location=" + loc);

我收到错误:

  

论证"是"缺少,没有默认

请告诉我这里我做错了什么。我应该把" ifelse"在"滞后"之前还有?

感谢。

2 个答案:

答案 0 :(得分: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)

数据:

TIRE

答案 1 :(得分:0)

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的位置,创建X11 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进行分组,以避免在国家/地区交叉点产生不良影响。我相应地编辑了我的答案。