首页 > 解决方案 > 通过行名和列名中的时间戳查找值的有效算法

问题描述

例如,如果我有一个这样的 data.table:

              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

和其他data.table,我需要在其中添加包含上面给定特定时间戳和列名的值的其他列:

             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

它应该如下所示:

             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

实际上,我的表很长(最多 100,000 行),当我实现这样的算法时需要很长时间才能运行:

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]

这是生成数据的额外代码:

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

标签: roptimization

解决方案


我们可以试试这个吗?首先使用;转置dt1为长格式 gather然后按时间戳和类右加入dt2(查找值)。不确定以下代码是否适合您的大数据。但可以试一试。

library(dplyr)
dt1 %>% 
  gather(key = class, value = value, 2:4) %>% 
  right_join(dt2, by = c('timestamp', 'class'))

            timestamp class     value
1 2014-10-04 02:10:54     A 0.6719328
2 2014-10-04 04:21:49     A 0.4344919
3 2014-10-04 06:32:43     A 0.8979173
4 2014-10-04 08:43:38     B 0.2372619
5 2014-10-04 19:38:10     B 0.6164465
6 2014-10-05 00:00:00     C 0.1237939

推荐阅读