【问题标题】:Build a data frame with overlapping observations构建具有重叠观察的数据框
【发布时间】:2018-02-12 14:33:54
【问题描述】:

假设我有一个具有以下结构的数据框:

> 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、2&3、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

我可以做一个像

这样的循环
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

我试图在不应用任何聚合函数的情况下重复一行行。这不起作用,因为我缺少一些行

我对此感到有些困惑,并四处寻找类似的问题,但找不到任何问题。有没有人有更好的想法?

【问题讨论】:

    标签: r dataframe rolling-computation


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 2017-04-13
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      相关资源
      最近更新 更多