2017-09-04 3 views
2

Disons que j'ai une trame de données avec la structure suivante:Construire une trame de données avec des observations qui se chevauchent

> 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 

Je dois construire une nouvelle trame de données avec des observations qui se chevauchent de la première trame de données à utiliser comme entrée pour construire la matrice A pour la bibliothèque d'optimisation Rglpk. J'utiliserais des fenêtres d'observation de longueur n, de sorte que si n = 2, la trame de données résultante rejoindrait les lignes 1 & 2, 2 & 3, 3 & 4, et ainsi de suite. La longueur de la trame de données résultant serait

(numberOfObservations-windowSize+1)*windowSize 

Le résultat de cet exemple avec windowSize = 2 serait une structure comme

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 

je puisse faire une boucle comme

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

Mais cela semble très inefficace, surtout pour les trames de données très volumineuses.

J'ai aussi essayé

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 

où je tentais de répéter un bloc de lignes sans appliquer une fonction d'agrégation. Cela ne fonctionne pas car il me manque quelques lignes

Je suis un peu perplexe et j'ai cherché des problèmes similaires mais je n'en ai trouvé aucun. Est-ce que quelqu'un a de meilleures idées?

Répondre

2

Nous pourrions faire une approche vectorisé

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