连续将行重新采样到数据帧的列中(用于时间序列分析)

Successively resampling rows into columns of a data frame (for time series analysis)

我有一个示例数据框 df:

  x1 x2 x3
1  1  6 11
2  2  7 12
3  3  8 13
4  4  9 14
5  5 10 15

现在我想按以下方式对该数据框重新采样:

转到第一行并提取k(例如3)行并将它们转换为columns/vector:

1  6 11  2  7 12  3  8 13

然后,转到第二行,做同样的事情:

2  7 12  3  8 13  4  9 14

第三行是

3  8 13  4  9 14  5 10 15

等等...

最后,所有重新采样的行也就是向量应该绑定到一个新的数据帧。

我在寻找有效解决方案方面做了很多工作,但所有实施都非常缓慢。

我怎样才能有效地解决我的问题?

这是一个简单的解决方案。我已将结果放入列表中,但它们可以很容易地 cbind 编辑到数据框中。

dlist<-list()
for(i in 1:(nrow(data)-2)) {
  dlist[[i]]<-matrix(t(data[i:(i+2),]),nrow=1)
  }

dlist
[[1]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    1    6   11    2    7   12    3    8   13

[[2]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    2    7   12    3    8   13    4    9   14

[[3]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    3    8   13    4    9   14    5   10   15

这是个好问题!所以,我只是把这个替代解决方案放在这里,以防我将来回来寻找它:-)

library(purrr)

map((nrow(df) - 1):0,~c(t(df[(nrow(df) - .x):nrow(df),]))[1:(k * ncol(df))]) %>% 
  do.call(rbind,.)

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    1    6   11    2    7   12    3    8   13
[2,]    2    7   12    3    8   13    4    9   14
[3,]    3    8   13    4    9   14    5   10   15
[4,]    4    9   14    5   10   15   NA   NA   NA
[5,]    5   10   15   NA   NA   NA   NA   NA   NA

显然,我们可以过滤掉 NA-s,但我相信这是更通用的解决方案。