2017-09-04 6 views
2

Lets sagen, dass ich einen Datenrahmen mit der folgenden Struktur:beim Aufbau eines Datenrahmens mit überlappenden Beobachtungen

> 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 

ich mit überlappenden Beobachtungen aus dem ersten Datenrahmen einen neuen Datenrahmen aufbauen müssen als ein verwendet werden Eingabe zum Erstellen der A-Matrix für die Rglpk-Optimierungsbibliothek. Ich würde Beobachtungsfenster der Länge n verwenden, so dass, wenn n = 2 ist, der resultierende Datenrahmen den Reihen 1 & 2, 2 & 3, 3 & 4 und so weiter beitreten würde. Die Länge des resultierenden Datenrahmen würde

(numberOfObservations-windowSize+1)*windowSize 

Das Ergebnis in diesem Beispiel mit Window = 2 würde wie eine Struktur sein

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 

Ich konnte eine Schleife machen wie

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

Dies scheint jedoch sehr ineffizient zu sein, insbesondere für sehr große Datenrahmen.

Ich habe auch versucht

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 

, wo ich ohne Anwendung irgendeiner Aggregatfunktion einen Block von Zeilen zu wiederholen versuchte. Dies funktioniert nicht, da ich einige Zeilen vermisse

Ich bin ein bisschen ratlos und habe nach ähnlichen Problemen gesucht, konnte aber keine finden. Hat jemand bessere Ideen?

Antwort

2

Wir könnten eine vektorisiert Ansatz tun

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 
Verwandte Themen