R 使用xts作为查找表

R 使用xts作为查找表,r,xts,lookup-tables,R,Xts,Lookup Tables,示例数据: 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 有一个小

示例数据:

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

有一个小问题与结果,你期望;默认情况下,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)]
2)匹配另一种可能性是像这样使用
match
。结果是与
b
中的时间对应的值:

v <- seq_along(a) # test values
v[match(b, a)]
## [1] 1 2 3 1 2 3

v ad 1)xts对象可以包含重复的时间戳,但我认为您的意思是,在这种情况下,语义可能会有问题。Ad 2)这就是我在中使用的
data.frame
ala
df[match(b,a),]
。非常感谢。是的,xts对象可以有重复的时间戳,但这并不真正相关,因为它们仍然无法表示您所需的输出,因为它们总是被订购。啊,是的,我检查了订购情况,感谢您的澄清。感谢您让我知道以及
data.frame
示例。因此,
xts
确实不是实现这一点的合适工具。
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 
v <- seq_along(a) # test values
v[match(b, a)]
## [1] 1 2 3 1 2 3