Понравилось решение Чарльза, которое отлично работает для случая n = 2. Увы, это не распространяется на большие окна. У него все еще есть проблема, описанная OP: при больших окнах выбор не центрируется вокруг значения поиска. Учитывая четность, я придумал следующее решение, в значительной степени основанное на идее Чарльза.
Функция контролирует границы. если есть 100 дней, а следующая средняя точка, скажем, второй последний день, окно 4 будет означать, что вы выберете индекс 101, который дает NA
. Эта функция сдвигает окно, поэтому все выбранные индексы лежат в исходных данных. Это также имеет побочный эффект, заключающийся в том, что в зависимости от значений начала (st
), длины (l
) и оконного (n
) значения начала и конца имеют более высокий шанс выбора дважды. Длина всегда должна быть как минимум вдвое больше размера окна.
Выводом функции являются индексы примера начальной загрузки. Его можно использовать как переменную Чарльза pos
для векторов и фреймов данных.
bboot <- function(day,st,l,n){
mid <- seq(st,max(day),by=l)
x <-sort(setdiff(day,mid))
lx <- length(x)
id <- sapply(mid,
function(y){
m <- match(T,x>y)
seq(
from=min( lx-n, max(1,m+(-n/2)) ),
to=min( lx, max(n,m+(n/2-1)) )
)
}
)
pos <- match(x[id],day)
return(pos)
}
Тогда
> day <- sample(1:100,50)
> sample.rownr <- bboot(day,10,20,6)
> sort(day)
[1] 3 4 5 7 9 10 13 15 16 18 19 21 22 24 25 26 27 28 29
[20] 30 31 32 35 36 38 40 45 49 51 52 54 55 58 59 62 65 69 72 73
[40] 74 80 84 87 88 91 92 94 97 98 99
> day[sample.rownr]
[1] 5 7 9 13 15 16 27 28 29 31 32 35 40 45 49 51 52 54 62
[20] 65 69 72 73 74 84 87 88 91 92 94
>
edit: в отношении начальной загрузки для временных рядов, вы должны просмотреть обзор задач CRAN для временных рядов , особенно раздел о повторной выборке. Для нерегулярных временных рядов пакет zoo
также предлагает ряд других функций, которые могут пригодиться.