下面是一个使用foverlaps
从包装data.table
,用下面的玩具数据集的一种方法:
library(data.table)
##
set.seed(123)
ts1 <- data.table(
ts(rnorm(50, sd = .1), frequency = 260))[
,V2 := V1]
##
ts2 <- cbind(
ts(rnorm(50,-0.1,.5), frequency=260)
,ts(rnorm(50,0.1,.5), frequency=260))
ts2 <- data.table(
t(apply(ts2, 1, sort)))[
1, c("V1", "V2") := NA]
setkeyv(ts2, c("V1","V2"))
由于foverlaps
从每个输入data.table
S的需要两列,我们只是复制了第一列ts1
(就我所知,这是惯例)。
fts <- foverlaps(
x = ts1, y = na.omit(ts2)
,type = "within")[
,list(Freq = .N)
,by = "V1,V2"]
这对加入ts2
ts1
为ts1
值中的每个ts2
的[V1, V2]
区间落在每一个发生 - 然后聚集由间隔获得计数。由于某些ts2
的间隔可能包含零ts1
值(这是此示例数据的情况)是可行的,因此您可以将汇总数据留在原始ts2
对象上,并得出相应的比例:
(merge(x = ts2, y = fdt, all.x=TRUE)[
is.na(Freq), Freq := 0][
,Inside := Freq/nrow(ts1)][
,Outside := 1 - Inside])[1:10,]
##
# V1 V2 Freq Inside Outside
# 1: NA NA 0 0.00 1.00
# 2: -1.2545844 -0.37373731 0 0.00 1.00
# 3: -0.9266236 -0.21024328 1 0.02 0.98
# 4: -0.8743764 -0.29245223 0 0.00 1.00
# 5: -0.7339710 0.19230687 50 1.00 0.00
# 6: -0.7103589 0.13898042 50 1.00 0.00
# 7: -0.7089414 -0.26660369 0 0.00 1.00
# 8: -0.7007681 0.58032622 50 1.00 0.00
# 9: -0.6860721 0.01936587 35 0.70 0.30
# 10: -0.6573338 -0.41395304 0 0.00 1.00
你需要做的第一件事就是呈现一个R对象。该输出并不表明你还没有对R做过任何事情。这不是打印操作的典型结果。制作一个对象并在R代码中显示所需的间隔中断。 –
他们是我认为的时间系列对象 – user137425
你的范围总是对称零?在这种情况下,与绝对值比较将是最简单的。 – Frank