我有两个时间序列我要合并:activity
(几乎)常规,5分钟时间步,另一个temperature
是一个不规则的时间序列,时间戳不是在任何时候都匹配activity
中的时间戳。
我想将“temperature $ temp”列添加到数据集activity
,其中NAs表示没有临时记录的时间,以及分配给{{1}中最接近的时间戳的实际临时记录}。 (可选择最接近的先前或后续时间戳)。
以前我使用approxfun函数来插值温度数据以匹配活动时间序列,但这并不理想,我想只包括实际记录的温度。
到目前为止,我还无法修改在堆栈溢出和其他地方发布的类似时间序列问题的解决方案,因为他们要么假设时间序列在某些时候匹配,要么他们的目标是合并时间序列的输出,以便包括两个数据集的时间戳,这两者都不是这种情况。
activity
我非常感谢您给我的任何帮助或建议。
答案 0 :(得分:1)
首先,定义一个确定最近索引位置的小辅助函数:
findNearest <- function(x, y)which.min(abs(x - y))
然后使用sapply
和findNearest
创建温度的索引向量。使用此索引向量创建所需的温度矢量
idx <- sapply(activity$Date, findNearest, temperature$Date)
activity$temp <- temperature$temp[idx]
结果:
head(activity)
Date Activity temp
1220 2012-10-18 06:36:59 300 12.625
1221 2012-10-18 06:41:59 300 12.625
1222 2012-10-18 06:46:59 300 12.625
1223 2012-10-18 06:51:59 300 12.625
1224 2012-10-18 06:56:59 300 12.625
1225 2012-10-18 07:01:59 300 12.625
tail(activity)
Date Activity temp
1233 2012-10-18 07:41:59 300 12.5
1234 2012-10-18 07:46:59 300 12.5
1235 2012-10-18 07:51:59 300 12.5
1236 2012-10-18 07:56:59 300 12.5
1237 2012-10-18 08:01:59 300 12.5
1238 2012-10-18 08:06:59 300 12.5
答案 1 :(得分:0)
data.table中的roll=
工具可以执行此操作:
library(data.table)
activity.dt <- data.table(activity, key="Date")[,Date2:=Date]
temperature.dt <- data.table(temperature)
activity.dt[temperature.dt, list(Date=Date2, temp), roll=-Inf][
activity.dt, list(Date, Activity, temp)]
,并提供:
Date Activity temp
1: 2012-10-18 06:36:59 300 NA
2: 2012-10-18 06:41:59 300 NA
3: 2012-10-18 06:46:59 300 NA
4: 2012-10-18 06:51:59 300 NA
5: 2012-10-18 06:56:59 300 12.625
6: 2012-10-18 07:01:59 300 NA
7: 2012-10-18 07:06:59 300 NA
8: 2012-10-18 07:11:59 207 NA
9: 2012-10-18 07:16:59 0 NA
10: 2012-10-18 07:21:59 0 NA
11: 2012-10-18 07:26:59 0 NA
12: 2012-10-18 07:31:59 0 NA
13: 2012-10-18 07:36:59 153 NA
14: 2012-10-18 07:41:59 300 NA
15: 2012-10-18 07:46:59 300 NA
16: 2012-10-18 07:51:59 300 NA
17: 2012-10-18 07:56:59 300 NA
18: 2012-10-18 08:01:59 300 12.500
19: 2012-10-18 08:06:59 300 NA