He escrito un (bastante ingenuo) función para seleccionar al azar una fecha/hora entre dos días especificados

# set start and end dates to sample between
day.start <- "2012/01/01"
day.end <- "2012/12/31"

# define a random date/time selection function
rand.day.time <- function(day.start,day.end,size) {
  dayseq <- seq.Date(as.Date(day.start),as.Date(day.end),by="day")
  dayselect <- sample(dayseq,size,replace=TRUE)
  hourselect <- sample(1:24,size,replace=TRUE)
  minselect <- sample(0:59,size,replace=TRUE)
  as.POSIXlt(paste(dayselect, hourselect,":",minselect,sep="") )
}

Que se traduce en:

> rand.day.time(day.start,day.end,size=3)
[1] "2012-02-07 21:42:00" "2012-09-02 07:27:00" "2012-06-15 01:13:00"

Pero esto parece estar disminuyendo considerablemente a medida que el tamaño de la muestra aumenta.

# some benchmarking
> system.time(rand.day.time(day.start,day.end,size=100000))
   user  system elapsed 
   4.68    0.03    4.70 
> system.time(rand.day.time(day.start,day.end,size=200000))
   user  system elapsed 
   9.42    0.06    9.49 

Es alguien capaz de sugerir la manera de hacer algo como esto en una manera más eficiente?

InformationsquelleAutor thelatemail | 2013-02-06

2 Comentarios

  1. 44

    Ahh, otra fecha/hora de problema se puede reducir a trabajar en las carrozas 🙂

    Probar esta función

    R> latemail <- function(N, st="2012/01/01", et="2012/12/31") {
    +     st <- as.POSIXct(as.Date(st))
    +     et <- as.POSIXct(as.Date(et))
    +     dt <- as.numeric(difftime(et,st,unit="sec"))
    +     ev <- sort(runif(N, 0, dt))
    +     rt <- st + ev
    + }
    R>

    Calculamos el difftime en cuestión de segundos y, a continuación, «simplemente» dibujar uniformes sobre él, ordenar el resultado. Añadir que para el inicio y ya está:

    R> set.seed(42); print(latemail(5))     ## round to date, or hour, or ...
    [1] "2012-04-14 05:34:56.369022 CDT" "2012-08-22 00:41:26.683809 CDT" 
    [3] "2012-10-29 21:43:16.335659 CDT" "2012-11-29 15:42:03.387701 CST"
    [5] "2012-12-07 18:46:50.233761 CST"
    R> system.time(latemail(100000))
       user  system elapsed 
      0.024   0.000   0.021 
    R> system.time(latemail(200000))
       user  system elapsed 
      0.044   0.000   0.045 
    R> system.time(latemail(10000000))   ## a few more than in your example :)
       user  system elapsed 
      3.240   0.172   3.428 
    R> 
    • Primera regla de trabajar con fechas y horas: siempre recuerde que POSIXct es realmente sólo una numérico con fracciones de segundos desde theepoch. Dito para Date y las fracciones de días. Una gran cantidad de problemas de convertirse en un mucho más fácil de esa manera.
    • El genio de esta respuesta es la st + ev truco … es el viaje de ida y vuelta a un POSIXct que es doloroso, ya que es necesario especificar explícitamente el origen. De lo contrario, runif(N, as.POSIXct(st), as.POSIXct(et)) consigue el 90% de este; pero entonces usted necesita para as.POSIXct(..., origin="1970-01-01")
    • ¿Por qué el sort de comandos a la hora de generar una secuencia aleatoria de valores?
    • Me parece preferible tener fechas de pedido. Usted, evidentemente, puede hacer que opcional a través de un parámetro de la función.
    • Cómo mantener a todas las zonas horarias de la misma?
  2. 2

    Algo como esto será trabajar demasiado. Lo siento por el azar del marco de datos, sólo me arrojó que en allí, así que usted puede ver un diagrama.

    data=as.data.frame(list(ID=1:10,
                       variable=rnorm(10,50,10)))
    
    #This function will generate a uniform sample of dates from 
    #within a designated start and end date:
    
    rand.date=function(start.day,end.day,data){   
      size=dim(data)[1]    
      days=seq.Date(as.Date(start.day),as.Date(end.day),by="day")  
      pick.day=runif(size,1,length(days))  
      date=days[pick.day]  
    }
    
    #This will create a new column within your data frame called date:
    
    data$date=rand.date("2014-01-01","2014-02-28",data)
    
    #and this will order your data frame by date:
    
    data=data[order(data$date),]
    
    #Finally, you can see how the data looks
    
    plot(data$date,data$variable,type="b")

Dejar respuesta

Please enter your comment!
Please enter your name here