R 延迟日期视情况而定,结转

R 延迟日期视情况而定,结转,r,time-series,R,Time Series,我反复测量了那些在募捐时捐款或未捐款的个人。我希望我能把上一次成功的征集日期推迟到下一次观察,直到取得新的成功 以下是我的示例数据: set.seed(13) df <- data.frame(ID=rep(letters[1:3], each=4), SolicitationDate= sample(seq(as.Date('2016/01/01'), as.Date('2018/01/01'), by="day"), 3), Su

我反复测量了那些在募捐时捐款或未捐款的个人。我希望我能把上一次成功的征集日期推迟到下一次观察,直到取得新的成功

以下是我的示例数据:

set.seed(13)
df <- data.frame(ID=rep(letters[1:3], each=4), 
             SolicitationDate= sample(seq(as.Date('2016/01/01'), 
as.Date('2018/01/01'), by="day"), 3),
             Success=rbinom(4,1,0.2))

df$ExpectedResult <- c(NA, NA, "2016-06-28", "2016-06-28",
                NA, NA, "2016-10-11", "2016-10-11",
                NA,NA,"2017-06-03", "2017-06-03")
set.seed(13)

df这里有一个使用
tidyverse
的版本。我认为您的预期输出可能不正确,因为日期应该在ID内排序,但这可能是错误的。那样的话,请告诉我

df %>% 
  group_by(ID) %>%    # Group by ID
  arrange(SolicitationDate) %>%     # Sort according to date
  mutate(res=replace(SolicitationDate, Success==0, NA)) %>%   # Create new value
  tidyr::fill(res)    # Fill down 
这会给你

# A tibble: 12 x 4
# Groups:   ID [3]
   ID    SolicitationDate Success res       
   <fct> <date>             <int> <date>    
 1 a     2016-06-28             1 2016-06-28
 2 a     2016-10-11             0 2016-06-28
 3 a     2017-06-03             0 2016-06-28
 4 a     2017-06-03             0 2016-06-28
 5 b     2016-06-28             0 NA        
 6 b     2016-06-28             0 NA        
 7 b     2016-10-11             1 2016-10-11
 8 b     2017-06-03             0 2016-10-11
 9 c     2016-06-28             0 NA        
10 c     2016-10-11             0 NA        
11 c     2016-10-11             0 NA        
12 c     2017-06-03             1 2017-06-03
#一个tible:12 x 4
#组别:ID[3]
ID请求日期成功率
1 a 2016-06-28 1 2016-06-28
2 a 2016-10-11 0 2016-06-28
3A 2017-06-03 0 2016-06-28
4 a 2017-06-03 0 2016-06-28
5b 2016-06-28 0北美
6 b 2016-06-28 0不适用
7 b 2016-10-11 1 2016-10-11
8 b 2017-06-03 0 2016-10-11
9 c 2016-06-28 0北美
10 c 2016-10-11 0北美
11 c 2016-10-11 0北美
12 c 2017-06-03 1 2017-06-03
我不确定你是否希望成功日期成为结果的一部分。如果没有,则可以设置为“缺少”,然后再次填充。无论如何,希望这能有所帮助