Создайте фрейм данных с перекрывающимися наблюдениями

Допустим, у меня есть фрейм данных со следующей структурой:

> 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

Мне нужно создать новый фрейм данных с перекрывающимися наблюдениями из первого фрейма данных, который будет использоваться в качестве входных данных для построения матрицы A для библиотеки оптимизации Rglpk. Я бы использовал окна наблюдения 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

где я пытался повторить блок строк без применения какой-либо агрегатной функции. Это не работает, так как мне не хватает некоторых строк

Я немного озадачен этим и искал похожие проблемы, но не смог их найти. У кого-нибудь есть идеи получше?


person PatrickD    schedule 04.09.2017    source источник


Ответы (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
person akrun    schedule 04.09.2017