2017-03-23 74 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語句。