Учитывая вектор (столбец фрейма данных), я хотел бы создать скользящий вектор.
l = 0:10
Вернется (с окном 3):
[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5] ...
Учитывая вектор (столбец фрейма данных), я хотел бы создать скользящий вектор.
l = 0:10
Вернется (с окном 3):
[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5] ...
1) rollapply r
— это матрица 9x3, каждая из строк которой является одним из запрошенных элементов списка, а split
превращает ее в список векторов. Хотя это дает то, о чем вы просили, возможно, вы просто хотите перебрать этот список, и в этом случае может быть проще просто заменить c
любой функцией, которую вы хотите использовать в этой итерации. например rollapply(l, 3, sd)
library(zoo)
l <- 0:10 # test input
r <- rollapply(l, 3, c)
split(r, row(r))
давая:
$`1`
[1] 0 1 2
$`2`
[1] 1 2 3
$`3`
[1] 2 3 4
$`4`
[1] 3 4 5
$`5`
[1] 4 5 6
$`6`
[1] 5 6 7
$`7`
[1] 6 7 8
$`8`
[1] 7 8 9
$`9`
[1] 8 9 10
2) встроить Это также можно сделать с помощью базы R следующим образом:
r <- embed(l, 3)[, 3:1]
split(r, row(r))
Вы можете использовать следующую функцию (я предполагаю, что вы хотите, чтобы значения были отсортированы в первую очередь. Если нет, просто удалите строку кода, где я использую sort()
):
roll<-function(list,window){
list<-sort(list,decreasing = FALSE)
res<-vector(mode = "list")
for(i in 1:(length(list) - window + 1)){
res[[i]]<-list[i:(i + window - 1)]
}
return(res)
}
Введите значения столбца/списка в аргумент вместе с желаемым размером окна, и он должен дать вам желаемый результат.
Например:
test<-0:10
roll(list = test,window = 3)
Это приводит к следующему результату:
[[1]]
[1] 0 1 2
[[2]]
[1] 1 2 3
[[3]]
[1] 2 3 4
[[4]]
[1] 3 4 5
[[5]]
[1] 4 5 6
[[6]]
[1] 5 6 7
[[7]]
[1] 6 7 8
[[8]]
[1] 7 8 9
[[9]]
[1] 8 9 10
Вы можете использовать эту функцию для других случаев и даже изменить размер окна в соответствии с вашими требованиями.
Надеюсь, это поможет!