矢量化滚动展开/分割/子集

时间:2017-10-07 15:32:48

标签: r

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

x <- data.frame(c(1,7,2,5,3,6,4))

以下是我将如何使用循环,但我想要一些矢量化

res <- NULL
for (i in 1:3){
  res_temp <- x[i:(i+4),]
  res <- cbind(res,res_temp)
}
res
     res_temp res_temp res_temp
[1,]        1        7        2
[2,]        7        2        5
[3,]        2        5        3
[4,]        5        3        6
[5,]        3        6        4

2 个答案:

答案 0 :(得分: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))[]

答案 1 :(得分: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

如果x不是vector,请执行x <- df[[the_index_you_want]]