使用 xts 作为查找 table

Use xts as a lookup table

示例数据:

library(xts)
a <- seq(as.POSIXct("2010-01-01 00:00:00"), by = 600, length.out = 3)
b <- c(a, a)
lu <- xts(seq_along(a), a)
lu[b]

                    [,1]
2010-01-01 00:00:00    1
2010-01-01 00:10:00    2
2010-01-01 00:20:00    3

如何 "look up" b 中时间戳的 lu 值,例如与 b 长度相同的 xts 对象,在本例中为:

                    [,1]
2010-01-01 00:00:00    1
2010-01-01 00:10:00    2
2010-01-01 00:20:00    3
2010-01-01 00:00:00    1
2010-01-01 00:10:00    2
2010-01-01 00:20:00    3

您预期的结果存在一个小问题; XTS 默认排序时间戳。所以 XTS 对象的结果将是 1,1,2,2,3,3。

以下内容可以给您一些启发:

lu[match(b, index(lu))] #XTS object returned - Timestamps are ordered by default 
data.frame(ts = index(lu), lu) [match(b, index(lu)),] #Using dataframes instead reproduce the expected result.

1) 按名称索引 xts 并不是执行此操作的正确包,因为您想要的结果不能是有效的 xts 对象。而是尝试以下不使用任何包的方法。输出向量的名称是时间的字符表示,向量值本身是所需的值:

lutable <- setNames(seq_along(a), a)
lutable[format(b)]

给予:

2010-01-01 00:00:00 2010-01-01 00:10:00 2010-01-01 00:20:00 2010-01-01 00:00:00 2010-01-01 00:10:00 2010-01-01 00:20:00 
                  1                   2                   3                   1                   2                   3 

2) match 另一种可能就是这样使用 match。结果是对应于 b:

中的时间的值
v <- seq_along(a) # test values
v[match(b, a)]
## [1] 1 2 3 1 2 3