r - 通过行名和列名中的时间戳查找值的有效算法
问题描述
例如,如果我有一个这样的 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")
)
解决方案
我们可以试试这个吗?首先使用;转置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
推荐阅读
- html - 对齐表格单元格内的溢出文本和图标
- json - 邮递员将多个xml值提取为json作为全局变量
- python - Python中的字典到JSON
- mysql - 如何使用 SQL 设置一个值并更改满足条件的所有其他值
- python - python Tkinter - 如何计算扩展标签中可以显示的字符数量?
- javascript - 使用jQuery在页眉和页脚之间滚动时如何使侧边栏保持粘性(不滚动它们)?
- java - SSLException:不支持的记录版本未知
- arrays - 如何在两个数组之间找到相同的对象
- javascript - 未捕获的 TypeError:YT.Player 不是构造函数
- reactjs - 操作后如何更改导航栏中的所有样式