2017-03-23 1 views
0

Ich möchte eine Spalte von 0 und 1 basierend auf Ungleichungen von drei Spalten von Daten erstellen.Erstellen von Spalte 0 und 1 basierend auf Ungleichungen von drei Datumsspalten

Die Idee ist die folgende. Wenn event_date vor death_date oder study_over, die die Spalte event sollte == 1, wenn event_date nach death_date oder study_over auftritt, sollte event == 0. Beide event_date und death_date kann NAs enthalten.

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

Mein Versuch war die folgende

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

ich es auf die folgende Weise verwenden

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) 

Ich kann nicht herausfinden, wie dies zu tun. Irgendwelche Vorschläge?

+0

Ihre Beschreibung (für mich) etwas inkonsistent scheint * „vor death_date ** oder ** study_over“ * seine ein und * "tritt nach death_date ** oder ** study_over "* es ist Null. Ist es möglich, dass es vor death_rate aber nach study_over sein könnte? Wenn ja, welchen Wert sollte es nehmen? – user20650

+0

@ user20650 Ich konnte nicht herausfinden, wie man es fest in die Funktion einprogrammiert. Es wurde in post mit df [is.na (event), "event"] <- 0 behoben. – user6571411

Antwort

3

Dies würde scheinen, eine binäre Spalte zu konstruieren (mit NA's, wo benötigt), wo 1 bedeutet "event_date ist vor death_date oder study_over" und 0 wird an anderer Stelle verwendet. Wie bereits erwähnt Ihre Spezifikation deckt nicht alle Fälle:

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

Kann pmap_dbl() aus dem purrr Paket anstelle von 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 

Sie könnten auch in der dplyr Funktion interessiert sein, case_when() denn wenn sonst Aussagen viele Handhabung.

Verwandte Themen