根据三个日期列的不等式创建 0 和 1 列

Creating column of 0 and 1 based on inequalities of three date columns

我想根据三列日期的不等式创建一列 0 和 1。

思路如下。如果 event_datedeath_datestudy_over 之前,则 event 列应为 ==1,如果 event_date 出现在 death_date 或 [= 之后15=], 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)

我不知道该怎么做。有什么建议吗?

可以使用 purrr 包中的 pmap_dbl() 而不是 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 语句。

这似乎构建了一个二进制列(在需要的地方带有 NA),其中 1 表示 "event_date is before death_date or study_over",0 用于其他地方。正如已经指出的那样,您的规范并未涵盖所有情况:

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