【发布时间】:2014-09-04 21:25:58
【问题描述】:
假设有一个 2 列数据框,其中时间或距离列顺序增加,而观察列可能在这里和那里有 NA。我怎样才能有效地使用滑动窗口函数来获得一些统计数据,比如平均值,对于持续时间 X(例如 5 秒)的窗口中的观察,将窗口滑动 Y 秒(例如 2.5 秒),重复... 窗口中的观察次数基于时间列,因此每个窗口的观察次数和滑动窗口的观察次数可能会有所不同 该函数应该接受任何窗口大小,直到观测值和步长。
这是样本数据(请参阅“编辑:”了解更大的样本集)
set.seed(42)
dat <- data.frame(time = seq(1:20)+runif(20,0,1))
dat <- data.frame(dat, measure=c(diff(dat$time),NA_real_))
dat$measure[sample(1:19,2)] <- NA_real_
head(dat)
time measure
1 1.914806 1.0222694
2 2.937075 0.3490641
3 3.286140 NA
4 4.830448 0.8112979
5 5.641746 0.8773504
6 6.519096 1.2174924
Desired Output 针对 5 秒窗口、2.5 秒步长、第一个窗口从 -2.5 到 2.5、na.rm=FALSE 的特定情况:
[1] 1.0222694
[2] NA
[3] NA
[4] 1.0126639
[5] 0.9965048
[6] 0.9514456
[7] 1.0518228
[8] NA
[9] NA
[10] NA
解释:在所需的输出中,第一个窗口查找介于 -2.5 和 2.5 之间的时间。在这个窗口中观察到一个测量值,它不是一个 NA,因此我们得到这个观察结果:1.0222694。下一个窗口是从0到5,窗口中有一个NA,所以我们得到NA。从 2.5 到 7.5 的窗口也是如此。下一个窗口是从 5 到 10。窗口中有 5 个观测值,没有一个是 NA。因此,我们得到这 5 个观察值的平均值(即 mean(dat[dat$time >5 & dat$time
我尝试了什么:以下是我针对步长为窗口持续时间 1/2 的窗口的特定情况所尝试的:
windo <- 5 # duration in seconds of window
# partition into groups depending on which window(s) an observation falls in
# When step size >= window/2 and < window, need two grouping vectors
leaf1 <- round(ceiling(dat$time/(windo/2))+0.5)
leaf2 <- round(ceiling(dat$time/(windo/2))-0.5)
l1 <- tapply(dat$measure, leaf1, mean)
l2 <- tapply(dat$measure, leaf2, mean)
as.vector(rbind(l2,l1))
不灵活、不优雅、不高效。如果步长不是窗口大小的 1/2,则该方法将无法正常工作。
对此类问题的一般解决方案有什么想法吗?任何解决方案都是可以接受的。越快越好,尽管我更喜欢使用基本 R、data.table、Rcpp 和/或并行计算的解决方案。在我的真实数据集中,数据框列表中包含数百万个观察值(最大数据框约为 400,000 个观察值)。
以下是额外信息:更大的样本集
编辑:根据要求,这是一个更大、更真实的示例数据集,具有更多的 NA 和最小时间跨度 (~0.03)。不过,需要明确的是,数据帧列表包含像上面这样的小帧,以及像下面这样和更大的帧:
set.seed(42)
dat <- data.frame(time = seq(1:50000)+runif(50000, 0.025, 1))
dat <- data.frame(dat, measure=c(diff(dat$time),NA_real_))
dat$measure[sample(1:50000,1000)] <- NA_real_
dat$measure[c(350:450,3000:3300, 20000:28100)] <- NA_real_
dat <- dat[-c(1000:2000, 30000:35000),]
# a list with a realistic number of observations:
dat <- lapply(1:300,function(x) dat)
【问题讨论】:
-
你见过 RcppRoll 和它的朋友吗?我在this question 中做了一个很酷的窗口平均函数;这和你追求的相似吗?
-
@TrevorAlexander 感谢您将我指向
RcppRoll;我会看看的。至于您编写的函数,据我所知,该窗口基于观察次数而不是时间持续时间,这不是我所追求的。 -
是的,我认为您需要像问题中那样的代码来将时间持续时间分类为离散索引。
-
我们需要一个更大的真实样本集:一个具有真实数量的 NA 并且表示沿时间维度的最小间距的样本集。
标签: r time-series sliding-window