2017-03-23 4 views
0

3つの日付列の不等式に基づいて0と1の列を作成したいとします。3つの日付列の不等式に基づいて0と1の列を作成する

考え方は次のとおりです。 event_datedeath_date又はstudy_over前であれば、カラムeventは== 1であるべきであるevent_datedeath_date又はstudy_over後に発生した場合、eventは== 0 event_datedeath_date両方は、NASを含むことができるなければなりません。

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) 
) 

私の試みは、私はこれを行う方法を見つけ出すことはできません、次のよう

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) 

でそれを使用し、次の

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) 
    } 
    } 

ました。助言がありますか? else文であれば、多く扱うための代わりsapplyのpurrrパッケージからpmap_dbl()を使用することはでき

+0

あなたの説明は(私には)少し矛盾したようだ*「death_date前に**や** study_over」*その1、*は「** death_date後に発生しますまたは** study_over "*はゼロです。それはdeath_rateより前にあるかもしれないが、study_overの後である可能性はありますか?もしそうなら、どんな値をとるべきでしょうか。 – user20650

+0

@ user20650それを関数にハードコードする方法を理解できませんでした。 df [is.na(event)、 "event"] < - 0のポストで修正されました。 – user6571411

答えて

3

これは、(event_dateがdeath_dateまたはstudy_overの前にあることを示し、0が別の場所で使用されていることを示す)必要に応じて、NAを持つバイナリ列を作成するように見えます。すでに指摘したように、あなたの仕様では、すべてのケースをカバーしていない:

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

...

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()

関連する問題