varias superponer studio modificar graficos graficas ejes change r time-series

superponer - Calcular días desde el último evento en R



superponer graficas en r (4)

Mi pregunta involucra cómo calcular la cantidad de días desde el último evento que ocurrió en R. A continuación se muestra un ejemplo mínimo de los datos:

df <- data.frame(date=as.Date(c("06/07/2000","15/09/2000","15/10/2000","03/01/2001","17/03/2001","23/05/2001","26/08/2001"), "%d/%m/%Y"), event=c(0,0,1,0,1,1,0)) date event 1 2000-07-06 0 2 2000-09-15 0 3 2000-10-15 1 4 2001-01-03 0 5 2001-03-17 1 6 2001-05-23 1 7 2001-08-26 0

Una variable binaria (evento) tiene valores 1 que indican que el evento ocurrió y 0 de lo contrario. Las observaciones repetidas se realizan en diferentes momentos ( date ) El resultado esperado es el siguiente con los días desde el último evento ( tae ):

date event tae 1 2000-07-06 0 NA 2 2000-09-15 0 NA 3 2000-10-15 1 0 4 2001-01-03 0 80 5 2001-03-17 1 153 6 2001-05-23 1 67 7 2001-08-26 0 95

He buscado respuestas a problemas similares pero no tratan mi problema específico. He intentado implementar ideas de una publicación similar ( Calcular el tiempo transcurrido desde el último evento ) y a continuación es lo más cercano a la solución:

library(dplyr) df %>% mutate(tmp_a = c(0, diff(date)) * !event, tae = cumsum(tmp_a))

Lo que da como resultado el resultado que se muestra a continuación, no es exactamente el esperado:

date event tmp_a tae 1 2000-07-06 0 0 0 2 2000-09-15 0 71 71 3 2000-10-15 1 0 71 4 2001-01-03 0 80 151 5 2001-03-17 1 0 151 6 2001-05-23 1 0 151 7 2001-08-26 0 95 246

Cualquier ayuda sobre cómo ajustar este u otro enfoque sería muy apreciada.


Es doloroso y pierdes el rendimiento, pero puedes hacerlo con un bucle for :

datas <- read.table(text = "date event 2000-07-06 0 2000-09-15 0 2000-10-15 1 2001-01-03 0 2001-03-17 1 2001-05-23 1 2001-08-26 0", header = TRUE, stringsAsFactors = FALSE) datas <- transform(datas, date = as.Date(date)) lastEvent <- NA tae <- rep(NA, length(datas$event)) for (i in 2:length(datas$event)) { if (datas$event[i-1] == 1) { lastEvent <- datas$date[i-1] } tae[i] <- datas$date[i] - lastEvent # To set the first occuring event as 0 and not NA if (datas$event[i] == 1 && sum(datas$event[1:i-1] == 1) == 0) { tae[i] <- 0 } } cbind(datas, tae) date event tae 1 2000-07-06 0 NA 2 2000-09-15 0 NA 3 2000-10-15 1 0 4 2001-01-03 0 80 5 2001-03-17 1 153 6 2001-05-23 1 67 7 2001-08-26 0 95


Podrías probar algo como esto:

# make an index of the latest events last_event_index <- cumsum(df$event) + 1 # shift it by one to the right last_event_index <- c(1, last_event_index[1:length(last_event_index) - 1]) # get the dates of the events and index the vector with the last_event_index, # added an NA as the first date because there was no event last_event_date <- c(as.Date(NA), df[which(df$event==1), "date"])[last_event_index] # substract the event''s date with the date of the last event df$tae <- df$date - last_event_date df # date event tae #1 2000-07-06 0 NA days #2 2000-09-15 0 NA days #3 2000-10-15 1 NA days #4 2001-01-03 0 80 days #5 2001-03-17 1 153 days #6 2001-05-23 1 67 days #7 2001-08-26 0 95 days


Pregunta antigua, pero estaba experimentando con uniones rotativas y esto me pareció interesante.

library(data.table) setDT(df) setkey(df, date) # rolling self-join to attach last event time df = df[event == 1, .(lastevent = date), key = date][df, roll = TRUE] # find difference between record and previous event == 1 record df[, tae := difftime(lastevent, shift(lastevent, 1L, "lag"), unit = "days")] # difftime for simple case between date and joint on previous event df[event == 0, tae:= difftime(date, lastevent, unit = "days")] > df date lastevent event tae 1: 2000-07-06 <NA> 0 NA days 2: 2000-09-15 <NA> 0 NA days 3: 2000-10-15 2000-10-15 1 NA days 4: 2001-01-03 2000-10-15 0 80 days 5: 2001-03-17 2001-03-17 1 153 days 6: 2001-05-23 2001-05-23 1 67 days 7: 2001-08-26 2001-05-23 0 95 days


tidyr::fill tarde a la fiesta, pero usé tidyr::fill para hacer esto más fácil. Básicamente, convierte los no eventos a valores faltantes, luego usa el fill para completar los NA con el último evento y luego resta la fecha actual del último evento.

He probado esto con una columna de fecha entera, por lo que podría necesitar algunos ajustes para una columna de fecha-tipo (especialmente el uso de NA_integer_ . No estoy seguro de cuál es el tipo subyacente para los objetos de Date ; supongo que NA_real_ .)

df %>% mutate( event = as.logical(event), last_event = if_else(event, true = date, false = NA_integer_)) %>% fill(last_event) %>% mutate(event_age = date - last_event)