R 矢量化滚动排列/分割/子集

R 矢量化滚动排列/分割/子集,r,R,我有一个data.frame,我想用cbind将它拆分成连续的子集。例如,对于下面的data.frame,我想要5个数据点的所有序列。最终结果将是3列(见下文) x以下是一些解决方案。它们都在第一行使用k的值: k <- nrow(x) - 5 + 1 # 1 - embed embed(x[[1]], k)[, k:1] # 2 - sapply t(sapply(seq_len(nrow(x) - k + 1), function(i) x[i + 1:k-1, 1])) # 3

我有一个
data.frame
,我想用
cbind
将它拆分成连续的子集。例如,对于下面的
data.frame
,我想要5个数据点的所有序列。最终结果将是3列(见下文)


x以下是一些解决方案。它们都在第一行使用
k
的值:

k <- nrow(x) - 5 + 1

# 1 - embed
embed(x[[1]], k)[, k:1]

# 2 - sapply
t(sapply(seq_len(nrow(x) - k + 1), function(i) x[i + 1:k-1, 1]))

# 3 - rollapplyr
library(zoo)
rollapplyr(x[[1]], k, c)

# 4 - lag.zoo
library(zoo)
na.omit(lag(zoo(x[[1]]), 1:k-1))[]

k我想这应该可以:

> # input
> length_n <- 5
> x <- c(1,7,2,5,3,6,4)
> 
> # make table
> length_x <- length(x)
> n_new_cols <- length_x - length_n + 1
> final_n_elemnts <- n_new_cols * length_n
> 
> idx <- 0:(final_n_elemnts - 1)
> idx <- (idx %/% length_n) + (idx %% length_n) + 1
> out <- matrix(x[idx], ncol = n_new_cols)
> out
     [,1] [,2] [,3]
[1,]    1    7    2
[2,]    7    2    5
[3,]    2    5    3
[4,]    5    3    6
[5,]    3    6    4
#输入
>长度x
>#摆桌子
>长度x新颜色最终元素
>idx idx out
[,1] [,2] [,3]
[1,]    1    7    2
[2,]    7    2    5
[3,]    2    5    3
[4,]    5    3    6
[5,]    3    6    4

如果开始时
x
不是
vector
,那么这看起来很有趣,但是,我不知道需要多少列。我想这是可行的:
embed(x[[1]],nrow(x)-5+1)[,(nrow(x)-5+1):1]
是的,这是可行的。更新答案以计算k。
k <- nrow(x) - 5 + 1

# 1 - embed
embed(x[[1]], k)[, k:1]

# 2 - sapply
t(sapply(seq_len(nrow(x) - k + 1), function(i) x[i + 1:k-1, 1]))

# 3 - rollapplyr
library(zoo)
rollapplyr(x[[1]], k, c)

# 4 - lag.zoo
library(zoo)
na.omit(lag(zoo(x[[1]]), 1:k-1))[]
> # input
> length_n <- 5
> x <- c(1,7,2,5,3,6,4)
> 
> # make table
> length_x <- length(x)
> n_new_cols <- length_x - length_n + 1
> final_n_elemnts <- n_new_cols * length_n
> 
> idx <- 0:(final_n_elemnts - 1)
> idx <- (idx %/% length_n) + (idx %% length_n) + 1
> out <- matrix(x[idx], ncol = n_new_cols)
> out
     [,1] [,2] [,3]
[1,]    1    7    2
[2,]    7    2    5
[3,]    2    5    3
[4,]    5    3    6
[5,]    3    6    4