Algoritmo eficaz para buscar valores por hora en la fila y columna de los nombres de
Por ejemplo, si he de datos.tabla como esta:
timestamp A B C
1: 2014-10-04 00:00:00 0.77931331 0.56750899 0.1017191
2: 2014-10-04 02:10:54 0.79579910 0.37156058 0.9536724
3: 2014-10-04 04:21:49 0.12088298 0.50284511 0.1332756
4: 2014-10-04 06:32:43 0.21722767 0.29294422 0.9135702
5: 2014-10-04 08:43:38 0.50177676 0.01302987 0.4106962
6: 2014-10-04 10:54:32 0.44592820 0.59690143 0.8262488
7: 2014-10-04 13:05:27 0.36409504 0.60071189 0.6558466
8: 2014-10-04 15:16:21 0.36094231 0.90065483 0.2410778
9: 2014-10-04 17:27:16 0.16668868 0.02374610 0.7664427
10: 2014-10-04 19:38:10 0.29222104 0.47992082 0.6199720
11: 2014-10-04 21:49:05 0.08729134 0.08450253 0.1184836
12: 2014-10-05 00:00:00 0.24222748 0.67493498 0.5414503
Y otros datos.tabla en la que tengo que agregar otra columna que contiene los valores por encima de determinada marca de tiempo y el nombre de la columna:
timestamp Class
1: 2014-10-04 00:00:00 A
2: 2014-10-04 04:21:49 A
3: 2014-10-04 08:43:38 A
4: 2014-10-04 10:54:32 B
5: 2014-10-04 15:16:21 B
6: 2014-10-04 21:49:05 C
En el que se debe tener este aspecto:
timestamp class value
1: 2014-10-04 00:00:00 A 0.77931331
2: 2014-10-04 04:21:49 A 0.12088298
3: 2014-10-04 08:43:38 A 0.50177676
4: 2014-10-04 10:54:32 B 0.59690143
5: 2014-10-04 15:16:21 B 0.90065483
6: 2014-10-04 21:49:05 C 0.11848360
En realidad, mis tablas son bastante largos (de hasta 100.000 filas) y tarda mucho tiempo en ejecutarse cuando he implementado un algoritmo como este:
class.values <- sapply(1:nrow(dt2), function (row) {
timestamp.tmp <- dt2[row,timestamp]
class.name <- d2[row,class]
dt1[timestamp == timestamp.tmp,get(class.name)]
})
dt2[,value := class.values]
Aquí está el código adicional para generar los datos:
library(data.table)
timestamps <- seq(as.POSIXct("2014-10-04"),as.POSIXct("2014-10-05"),length.out = 12)
dt1 <- data.table(
timestamp = timestamps,
A = runif(12),
B = runif(12),
C = runif(12)
)
dt2 <- data.table(
timestamp = sort(sample(timestamps,6)),
class = c("A","A","A","B","B","C")
)