2016-04-05 24 views
0

Ich data.frame wie dies mit:R Teil data.frame Replikation

h d m v1  v2  v3  v4 
0 4 0 0.8556 0.8556 0.8554 0.8556 
0 4 0 0.8568 0.8568 0.8566 0.8568 
1 4 0 0.8602 0.8602 0.8602 0.8602 
1 4 0 0.8568 0.8568 0.8528 0.8530 
2 4 0 0.8566 0.8568 0.8566 0.8568 

allgemeiner kann dargestellt werden als:

h1 d1 m1 v11 v12 v13 v14 
h2 d2 m2 v21 v22 v23 v24 
h3 d3 m3 v31 v32 v33 v34 
h4 d4 m4 v41 v42 v43 v44 
h5 d5 m5 v51 v52 v53 v54 

ich bin für die Art und Weise der Suche zu verwandeln

h1 d1 m1 v11 v12 v13 v14 v21 v22 v23 v24 v31 v32 v33 v34 
h2 d2 m2 v21 v22 v23 v24 v31 v32 v33 v34 v41 v42 v43 v44 
h3 d3 m3 v31 v32 v33 v34 v41 v42 v43 v44 v51 v52 v53 v54 
0: - es ist wie folgend mit Parametern recordsPerRow (beispielsweise gleich) würde die ausgegeben

So tooks es die i Reihe, da es nur v_ Werte aus dem nächsten i < und anhängt i recordsPerRow Zeilen it +.

habe ich eine Funktion, die die Arbeit erledigt, aber während es für Schleifen basierend auf ist, ist es ziemlich langsam (data.frame mit rund 300.000 Datensätzen dauert einige Minuten):

rows <- nrow(data) 
    cols <- ncol(data) 

    rowLength <- 3 + 4 * recordsPerRow 
    resultedRows <- rows - recordsPerRow + 1 
    resultLength <- resultedRows 
    result <- numeric(resultedRows * rowLength) 

    for (i in 1:resultLength) { 
    for(j in 1:recordsPerRow) { 
     if (j == 1) { 
     startIndex <- 1 + (i - 1) * rowLength 
     endIndex <- startIndex + 7 - 1 # + 7 -> row length; - 1 -> end is inclusive 
     result[startIndex:endIndex] <- as.numeric(data[i + j - 1,2:cols]) 

     } else { 
     startIndex <- lastIndex 
     endIndex <- startIndex + 4 - 1 # + 4 -> row length; - 1 -> end is inclusive 
     result[startIndex:endIndex] <- as.numeric(data[i + j - 1,5:cols]) 
     } 
     lastIndex <- endIndex + 1 
    } 

    } 
    result <- as.data.frame(matrix(result, ncol = rowLength, byrow = T)) 

Ich frage mich, ob es eine effizientere Lösung ist ?

+0

Was ist die Logik dahinter, die letzten zwei Zeilen der ersten drei Spalten auszulassen? – mtoto

+0

@mtoto Wenn ich Ihre Frage richtig verstehe, wurden die letzten zwei Zeilen weggelassen, vorausgesetzt, es ist das Ende des data.frame. Es gibt nicht genug Zeilen, um die vierte Ausgabezeile zu erstellen, weil es wie folgt aussehen sollte: h4 d4 m4 v41 v42 ... v61 v62 v63 v64 und jetzt gibt es Zeile nr 6 mit Werten wie 'v61 v62'. Also wird die Länge der Ausgabedaten.frame * Länge der Eingabedaten sein.frame - recordsPerRow + 1 * – f1ames

Antwort

0
n = 3 

do.call(cbind, lapply(1:(nrow(df)-n+1), function(i) df[i:(i+n-1), 4:7])) 
# V4 V5 V6 V7 V4 V5 V6 V7 V4 V5 V6 V7 
#1 v11 v12 v13 v14 v21 v22 v23 v24 v31 v32 v33 v34 
#2 v21 v22 v23 v24 v31 v32 v33 v34 v41 v42 v43 v44 
#3 v31 v32 v33 v34 v41 v42 v43 v44 v51 v52 v53 v54 
+0

Nun, es funktioniert ein wenig anders. Es erzeugt immer 'n' Zeilen und' nrow (df) - n + 1' Spalten. Wenn ich also df mit 10 Zeilen und n = 3 habe, wird df mit 3 Zeilen und 32 (8 * 4) Spalten erstellt, während ich df mit 8 Zeilen und 12 (3 * 4) Spalten haben möchte. – f1ames

+0

@ f1ames wenn Sie das oben genannte verstehen, sollte offensichtlich sein, wie man es ändert – eddi