2017-01-31 3 views
0

Ich versuche, einen Aggregationsprozess zu entwerfen. Ich versuche, die durch "expand.grid" verursachten Probleme zu vermeiden (d. H. Übermäßige Vektorlänge).Sequenzielles Aggregationsmodell - data.frame

Ich habe einen Datenrahmen DATA entworfen. Zunächst muss ich gemeinsam einen Prozess auf P1 und V1 und V2 und P2 anwenden. Einmal ausgeführt, müssen P1, P2, V1y V2 entfernt werden, und die Prozessausgabe (zwei Vektoren: P12 und V12) wird dem Datenrahmen DATA hinzugefügt, und der Prozess wird erneut auf die Vektoren V12 und P12 und V3 und P3 angewendet. Also nacheinander, bis V3 und P3 entfernt wurden, wurden V123 und P123 hinzugefügt, und der Prozess wurde erneut auf V123 und P123 und V4 und P4 angewendet. Der Datenrahmen ist mit NA oder 0 gefüllt.

Es ist wichtig zu beachten, dass ich normalerweise mit n Vektoren (Pi) und n Vektoren (Vi) arbeite.

Datenrahmen DATA:

P1 P2 P3 P4   V1  V2   V3 V4 
    1 0 0 0 0 0.34505340 0.9498 0.958886346 0.88 
    2 1 1 1 1 0.11640585 0.0338 0.012040961 0.04 
    3 2 2 2 2 0.09746205 0.0164 0.009259039 0.08 
    4 3 0 3 0 0.11484475 0.0000 0.019813654 0.00 
    5 4 0 0 0 0.32623395 0.0000 0.000000000 0.00 

Ein Beispiel Ausgabe:

 P12  V12  
1  0 0.1851 
2  1 0.1419 
3  2 0.1794 
4  3 0.1395 
5  4 0.3659 
6  5 -0.0045 
7  6 -0.0141 

Mit freundlichen Grüßen, majesus

+0

Können Sie eine Ausgabebeispieldaten zeigen? Ich versuche zu verstehen, was mit P12 oder V12 nach Ihrer Operation passiert. –

Antwort

1

Sie können die mit dplyr folgenden tun inkrementell Spalten mutieren zu. Ich speichere die Zielvariablen und die Formeln in einer Zeichenfolge. Dies ist nur ein einfaches Beispiel zur Veranschaulichung der Methode. Ich nehme an, Ihre Berechnung ist ein bisschen komplexer.

df <- data.frame(p1 = 0:4 
       ,p2 = c(0,1,2,0,0) 
       ,p3 = c(0:3,0) 
       ,p4 = c(0,1,2,0,0) 
       ,v1 = rnorm(5) 
       ,v2 = rnorm(5) 
       ,v3 = rnorm(5) 
       ,v5 = rnorm(5)) 

library(dplyr) 
var <- sapply(2:4,function(x) paste0('p',paste0(1:x, collapse=""))) 

form <- sapply(2:4,function(x) paste0("p",paste0(1:(x-1),collapse = ""),"*","p",x)) 

df %>% mutate_(.dots=setNames(form, var)) 

String-Vektoren:

> var 
[1] "p12" "p123" "p1234" 
> form 
[1] "p1*p2" "p12*p3" "p123*p4" 

Ergebnis:

p1 p2 p3 p4   v1   v2   v3   v5 p12 p123 p1234 
0 0 0 0 0.6901867 0.6365963 0.3526106 -0.8348200 0 0  0 
1 1 1 1 0.1530939 0.8553939 1.2160768 3.1494818 1 1  1 
2 2 2 2 1.2732477 -0.3102100 1.2538673 0.8904290 4 8 16 
3 0 3 0 0.9067448 0.7085275 -1.0328784 0.1979246 0 0  0 
4 0 0 0 -0.1388101 0.1275527 1.6018554 0.4335777 0 0  0 
+0

Vielen Dank für Ihre Antwort. Meine Aufgabe ist es, den Prozess gemeinsam auf die Variablen Pi und Vi anzuwenden, nicht nur auf Pi. Außerdem ist es für mich nicht einfach, den Prozess im "Funktionsmodus" zu programmieren. Kann ich "while" oder "for-loop" verwenden? – majesus

+0

Die Antwort ist nur eine Illustration. In der Tat ist es eine Schleife. Der Befehl "mutate_" bewertet jede Berechnung in der Vektorform sequenziell. Daher müssen Sie sicherstellen, dass in diesem Vektor auch eine Berechnung für v12 v123 und v1234 vorhanden ist. – Wietze314

+0

Das ist großartig! Vielen Dank. – majesus