在 R 中创建滚动列表
Create a rolling list in R
给定一个向量(数据框的列),我想创建一个滚动向量。
l = 0:10
会 return,(window 为 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) 嵌入 这也可以像这样使用 base 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)
}
在参数中输入您的 column/list 值以及您想要的 window 大小,它应该会为您提供所需的输出。
例如:
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
您可以将此功能用于其他情况,甚至可以根据您的要求更改 window 大小。
希望对您有所帮助!
给定一个向量(数据框的列),我想创建一个滚动向量。
l = 0:10
会 return,(window 为 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) 嵌入 这也可以像这样使用 base 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)
}
在参数中输入您的 column/list 值以及您想要的 window 大小,它应该会为您提供所需的输出。
例如:
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
您可以将此功能用于其他情况,甚至可以根据您的要求更改 window 大小。
希望对您有所帮助!