Tengo una serie de marcas de tiempo que marcan el comienzo y el final de ciertos eventos.Contando el número de eventos en curso en una marca de tiempo
library(chron)
start <- structure(c(14246.3805439815, 14246.3902662037, 14246.3909606481,
14246.3992939815, 14246.4013773148, 14246.4034606481, 14246.4062384259,
14246.4069328704, 14246.4069328704, 14246.4097106481, 14246.4097106481,
14246.4104050926, 14246.4117939815, 14246.4117939815, 14246.4117939815,
14246.4145717593, 14246.4152546296, 14246.4152662037, 14246.4152662037,
14246.4159606481), format = structure(c("m/d/y", "h:m:s"), .Names = c("dates",
"times")), origin = structure(c(1, 1, 1970), .Names = c("month",
"day", "year")), class = c("chron", "dates", "times"))
finish <- structure(c(14246.436099537, 14246.4666550926, 14246.4083217593,
14246.4374884259, 14246.4847106481, 14246.4867939815, 14246.4305439815,
14246.4659606481, 14246.4520717593, 14246.9097106481, 14246.4930439815,
14246.4763773148, 14246.4326273148, 14246.4291550926, 14246.4187384259,
14246.9145717593, 14246.4395601852, 14246.4395717593, 14246.4395717593,
14246.4367939815), format = structure(c("m/d/y", "h:m:s"), .Names = c("dates",
"times")), origin = structure(c(1, 1, 1970), .Names = c("month",
"day", "year")), class = c("chron", "dates", "times"))
events <- data.frame(start, finish)
head(event, 5)
start finish
1 (01/02/09 09:07:59) (01/02/09 10:27:59)
2 (01/02/09 09:21:59) (01/02/09 11:11:59)
3 (01/02/09 09:22:59) (01/02/09 09:47:59)
4 (01/02/09 09:34:59) (01/02/09 10:29:59)
5 (01/02/09 09:37:59) (01/02/09 11:37:59)
Ahora deseo contar cuántos eventos están en curso en sellos de tiempo específicos.
intervals <- structure(c(14246.3958333333, 14246.40625, 14246.4166666667,
14246.4270833333, 14246.4375), format = structure(c("m/d/y",
"h:m:s"), .Names = c("dates", "times")), origin = structure(c(1,
1, 1970), .Names = c("month", "day", "year")), class = c("chron",
"dates", "times"))
intervals
[1] (01/02/09 09:30:00) (01/02/09 09:45:00) (01/02/09 10:00:00) (01/02/09 10:15:00) (01/02/09 10:30:00)
Así que la salida de deseo es el siguiente:
intervals count
1 (01/01/09 09:30:00) 3
2 (01/01/09 09:45:00) 7
3 (01/01/09 10:00:00) 19
4 (01/01/09 10:15:00) 18
5 (01/01/09 10:30:00) 12
Si bien el problema es trivial para resolver mediante programación, deseo de lograr esto de 210.000 intervalos y más de 1,2 millones de eventos. Mi enfoque actual implica aprovechar el paquete data.table
y el operador &
para verificar si hay un intervalo entre el inicio y el final de cada evento.
library(data.table)
events <- data.table(events)
data.frame(intervals, count = sapply(1:5, function(i) sum(events[, start <= intervals[i] & intervals[i] <= finish])))
Pero teniendo en cuenta el tamaño de mis datos, este enfoque tarda mucho tiempo en ejecutarse. ¿Algún consejo sobre mejores alternativas para lograr esto en R?
Saludos.
Usted dice que está utilizando el 'data.table' paquete. ¿Quieres mostrarnos el código que usas? Su última línea de código no usa 'data.table' en absoluto. Simplemente está utilizando la base R en un 'data.frame'. – Andrie
El paquete data.table le permite '&' como un índice de columna. Lo siguiente arroja un error: 'events <- data.frame (eventos) data.frame (int, count = sapply (1: 5, función (i) sum (eventos [, inicio <= int [i ] & int [i] <= finish]))) ' –
Sutil ... Consíguelo ahora. D'oh. – Andrie