2017-03-23 110 views
0

的不平等,我想创建一个基于日期的三列的不平等0和1的列的0和1列。创建基于三个日期列

的想法如下。如果event_datedeath_datestudy_over之前,所述列event应== 1,如果发生event_datedeath_datestudy_over后,event应== 0,这两种event_datedeath_date可能包含的NA。

set.seed(1337) 
rand_dates <- Sys.Date() - 365:1 

df <- 
data.frame(
    event_date = sample(rand_dates, 20), 
    death_date = sample(rand_dates, 20), 
    study_over = sample(rand_dates, 20) 
) 

我的尝试是以下

eventR <- 
    function(x, y, z){ 
    if(is.na(y)){ 
     ifelse(x <= z, 1, 0) 
    } else if(y <= z){ 
     ifelse(x < y, 1, 0) 
    } else { 
     ifelse(x <= z, 1, 0) 
    } 
    } 

我用它通过以下方式

library(dplyr) 
df[c(3, 5, 7), "event_date"] <- NA #there are some NA in .$event_date 
df[c(3, 4, 6), "death_date"] <- NA #there are some NA in .$death_date 

df %>% 
mutate(event = sapply(.$event_date, eventR, y = .$death_date, z = .$study_over)) 
##Error: wrong result size (400), expected 20 or 1 
##In addition: There were 40 warnings (use warnings() to see them) 

我无法弄清楚如何做到这一点。有什么建议么?

+0

你的描述似乎显得有些不一致(对我来说)*“death_date之前** **或study_over” *它的一个,而*“death_date后发生**或** study_over“*它是零。它有可能在death_rate之前,但在study_over之后?如果是这样,那么什么样的价值应该是采取 – user20650

+0

@ user20650我无法弄清楚如何将其硬编码到函数。在后用df [is.na(事件), “事件”] <固定它 - 0。 – user6571411

回答

3

这似乎构造一个二进制列(与NA的在需要的地方),其中1表示“EVENT_DATE是death_date或study_over之前”和0被其他地方使用。前面已经指出的规格并不涵盖所有情况:

df$event <- with(df, as.numeric(event_date < pmax(death_date , study_over))) 
df 
1

可以使用pmap_dbl()从purrr包,而不是sapply ...

library(dplyr) 
library(purrr) 

df %>% mutate(event = pmap_dbl(list(event_date, death_date, study_over), eventR)) 

event_date death_date study_over event 
1 2016-10-20 2017-01-27 2016-12-16  1 
2 2016-10-15 2016-12-12 2017-01-20  1 
3  <NA>  <NA> 2016-10-09 NA 
4 2016-09-04  <NA> 2016-11-17  1 
5  <NA> 2016-10-13 2016-06-09 NA 
6 2016-07-21  <NA> 2016-04-26  0 
7  <NA> 2017-02-21 2016-07-12 NA 
8 2016-07-02 2017-02-08 2016-08-24  1 
9 2016-06-19 2016-09-07 2016-04-11  0 
10 2016-05-14 2017-03-13 2016-08-03  1 
11 2017-03-06 2017-02-05 2017-02-28  0 
12 2017-03-10 2016-04-28 2016-11-30  0 
13 2017-01-10 2016-12-10 2016-10-27  0 
14 2016-05-31 2016-06-12 2016-08-13  1 
15 2017-03-03 2016-12-25 2016-12-20  0 
16 2016-04-01 2016-11-03 2016-06-30  1 
17 2017-02-26 2017-02-25 2016-05-12  0 
18 2017-02-08 2016-12-08 2016-10-14  0 
19 2016-07-19 2016-07-03 2016-09-22  0 
20 2016-06-17 2016-06-06 2016-11-09  0 

您可能也有兴趣在dplyr功能,case_when()处理很多的if else语句。