如何使用时间间隔和分组加入2个data.tables

时间:2014-06-17 19:36:51

标签: r date datetime join data.table

我有经常收集的数据的数据表:

set.seed(1)
t1 <- seq(from=as.POSIXct('2014-1-1'), to=as.POSIXct('2014-6-1'), by='day')
T1 <- data.table(time1=t1, group=rep(c('A', 'B'), length(t1)/2), value1=rnorm(length(t1)))

和不经常收集的数据的数据表:

t2 <- seq(from=as.POSIXct('2014-1-1'), to=as.POSIXct('2014-6-1'), by='week')
T2 <- data.table(time2=t2, group=rep(c('A', 'B'), length(t2)/2), value2='ArbitraryText')

对于T2的每一行,我想找到T1T2$t2T2$t2减去1周之间的所有行,然后取平均值T1$V2的{​​{1}},T2$group

因此,结果表中的行数将完全等于T2中的行数以及应该为T2的第二行返回的“正确”值(平均值)在T1$value B中且在1月1日到1月22日之间的T1$group的值将如下所示:

          t2          group    value1            value2
2014-01-22 00:00:00     B     0.1674069     "Arbitrary Text"

我想第一步是为每个data.table设置键:

setkey(T1, group, time1)
setkey(T2, group, time2)

我不确定如何继续。奇怪地T1[T2[time1 %between% c(t2, t2-604800)]]仅产生1月1日到1月8日之间的结果,尽管默认为mult='all'

编辑:我应该指出,每个时间间隔(T2$time2减去3周到T2$time2)都是故意重叠的。这意味着T1的每一行都属于多个所需的平均值,因为它属于多个T2行所指定的区间。

1 个答案:

答案 0 :(得分:1)

尝试在T1中创建一个分组向量,该向量使用传递给cut.POSIXt函数的T2断点构建:

 T1[ , grp := cut(time1, breaks=T2[,time2]) ]
> str(T1)
Classes ‘data.table’ and 'data.frame':  151 obs. of  4 variables:
 $ time1: POSIXct, format: "2014-01-01 00:00:00" "2014-01-02 00:00:00" "2014-01-03 00:00:00" ...
 $ group: chr  "A" "B" "A" "B" ...
 $ value: num  -0.626 0.184 -0.836 1.595 0.33 ...
 $ grp  : Factor w/ 21 levels "2014-01-01 00:00:00",..: 1 1 1 1 1 1 1 2 2 2 ...
 - attr(*, ".internal.selfref")=<externalptr> 
#------------------
> T1[, mean(value), by="grp"]
#----------------
                    grp          V1
 1: 2014-01-01 00:00:00  0.04475859
 2: 2014-01-08 00:00:00  0.01062880
 3: 2014-01-15 00:00:00  0.62024902
 4: 2014-01-22 00:00:00 -0.31364304
 5: 2014-01-29 00:00:00  0.02178433
 6: 2014-02-05 00:00:00  0.08238828
 7: 2014-02-12 00:00:00  0.12544920
 8: 2014-02-19 00:00:00  0.47033820
 9: 2014-02-26 00:00:00  0.29648943
10: 2014-03-05 00:00:00  0.20856893
11: 2014-03-12 01:00:00 -0.28046960
12: 2014-03-19 01:00:00 -0.22334306
13: 2014-03-26 01:00:00  0.25434429
14: 2014-04-02 01:00:00  0.48056376
15: 2014-04-09 01:00:00 -0.52624880
16: 2014-04-16 01:00:00  0.62330703
17: 2014-04-23 01:00:00  0.01092562
18: 2014-04-30 01:00:00  0.12544150
19: 2014-05-07 01:00:00 -0.15919531
20: 2014-05-14 01:00:00 -0.61236195
21: 2014-05-21 01:00:00 -0.37797879
22:                  NA -0.61483084
                    grp          V1

你没有获得与T2中事件相同数量的组,而是数字减去1.我没有使用setkey,因为我的呼叫是对构造的列。如果它只是一次性使用,那么我不确定它是否需要。