我有经常收集的数据的数据表:
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
的每一行,我想找到T1
中T2$t2
和T2$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
行所指定的区间。
答案 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,因为我的呼叫是对构造的列。如果它只是一次性使用,那么我不确定它是否需要。