R在滑动窗口中编程计数次数

时间:2015-02-12 11:44:15

标签: r time-series sliding-window

对于包含用户ID和时间戳的data.frame,有一种快速方法可以在滑动时间范围内提取达到特定计数的用户ID。

例如,如果我想找到在30秒内出现10次的所有用户。

我的想法是首先仅对在整个data.set中达到目标计数(10)的用户进行子集化。然后为每个用户减去最后一个时间戳 - 如果小于时间刻度(30秒),则添加到目标列表。

如果没有那么先用秒测试,先用第三测试然后继续测试直到达到时间限制(30秒)或目标计数(10次)。达到时间限制后,我需要用当前元素测试第二个。

也许有一个库来帮助发现这些或某种形式的标准偏差,甚至是聚类 - 来帮助发现并提取一个较小的子集?

1 个答案:

答案 0 :(得分:1)

假设每秒一个点,我们生成一个100 id' s s的输入向量。然后我们rollapply在它上面输出ID超过10次的ID:

library(zoo)
set.seed(123)
s <- sample(c("a", "b", "c"), 100, replace = TRUE) # test data

f <- function(x) toString(names(which(table(x) > 10)))
rollapply(s, 30, f)

 [1] "c"    "c"    "c"    "c"    "c"    "c"    "c"    "c"    "c"    "c"   
[11] "c"    "a, c" "a, c" "a, c" "a, c" "a, c" "a"    "a"    "a"    "a"   
[21] "a"    "a"    "a"    "a"    "a"    "a"    "a"    "a"    "a"    "a"   
[31] "a"    "a"    "a"    "a"    "a"    "a"    "a"    "a"    "a"    "a"   
[41] "a, b" "b"    "b"    ""     "a"    ""     ""     "b"    "b"    "b"   
[51] "b"    "b"    "b"    "b"    "b"    "b"    "b"    "b, c" "b, c" "b, c"
[61] "b, c" "c"    "b, c" "b, c" "b, c" "b"    "b"    "b"    "b"    "b"   
[71] "b"   

上面的第一点对应于时间1-30,次要对应于时间2-31,等等。

下次请提供测试数据并显示预期答案。