2017-09-04 62 views
2

可以说我有具有以下结构的数据帧:构建具有重叠的观测数据帧

> DF <- data.frame(x=1:5, y=6:10) 
> DF 
    x y 
1 1 6 
2 2 7 
3 3 8 
4 4 9 
5 5 10 

我需要建立与来自第一数据帧重叠的观测一个新的数据帧被用作输入用于构建Rglpk优化库的A矩阵。我会使用n长的观察窗口,这样如果n = 2,结果数据帧将连接行1 & 2,3 & 4等等。所得到的数据帧的长度将是

(numberOfObservations-windowSize+1)*windowSize 

这个例子与windowSize结果= 2会像

x y 
1 1 6 
2 2 7 
3 2 7 
4 3 8 
5 3 8 
6 4 9 
7 4 9 
8 5 10 

I的结构可以做一个环状

DFResult <- NULL 
numBlocks <- nrow(DF)-windowSize+1 
for (i in 1:numBlocks) { 
    DFResult <- rbind(DFResult, DF[i:(i+horizon-1), ]) 
} 

但是这似乎很低效,特别是对于非常大的数据帧。

我也试过

rollapply(data=DF, width=windowSize, FUN=function(x) x, by.column=FALSE, by=1) 
    x y 
[1,] 1 6 
[2,] 2 7 
[3,] 2 7 
[4,] 3 8 

我在那里试图重复行的块不应用任何聚合函数。这是行不通的,因为我失去了一些行

我有点难倒了这一点,并环顾四周寻找类似的问题,但找不到任何。有没有人有更好的想法?

回答

2

我们可以做一个量化的方法

i1 <- seq_len(nrow(DF)) 
res <- DF[c(rbind(i1[-length(i1)], i1[-1])),] 
row.names(res) <- NULL 
res 
# x y 
#1 1 6 
#2 2 7 
#3 2 7 
#4 3 8 
#5 3 8 
#6 4 9 
#7 4 9 
#8 5 10