2016-03-23 18 views
-2

erstellen Ich habe zwei Datenrahmen unter df1 und df2. Ich möchte drei Datenrahmen basierend auf Szenarien in df2 aufgeführten erstellen. So wird zum Beispiel df3, das auf Szenario1 basiert, von df2 bis add10 bis cover, was alles eine (a1,a2,a3) in df1 ist.wie ich Datenrahmen in r

df1       
No a1 a2 a3 b1 b2 b3 
3 7 1 3 2 1 7 
3 9 4 9 7 6 2 
3 8 3 1 3 5 0 

df2   
Scenario Cover Action Number 
1   a Add  10 
2   a Subtract 7 
3   b Multiply 2 

df3   
No Scenario1a1 Scenario1a2 Scenario1a3 
3  17   11   13 
3  19   14   19 
3  18   13   11 

df4   
No Scenario2a1 Scenario2a2 Scenario2a3 
3  0  -6   -4 
3  2  -3   2 
3  1  -4   -6 

df5   
No Scenario3b1 Scenario3b2 Scenario3b3 
3  3  2   15 
3  14  12   3 
3  6  10   0 

Antwort

1

Die folgende Funktion nimmt eine Zeile von df2 als erstes Argument und df1 als zweites Argument.

apply.line <- function(line, df) 
{ 
    operators <- list(Add=function(x,y) x+y, 
         Subtract=function(x,y) x-y, 
         Multiply=function(x,y) x*y) 

    ret <- operators[[line$Action]](df[grepl(line$Cover, names(df))], line$Number) 
    names(ret) <- eval(call("paste0", "Scenario", line$Scenario, names(ret))) 
    ret 
} 

Verbrauch:

df3 <- apply.line(df2[1,], df1) 
df4 <- apply.line(df2[2,], df2) 
df5 <- apply.line(df2[3,], df3) 
+0

Danke, wie würde der Code ändern, wenn ich zu einer anderen Funktion 'New' wie 'New = Funktion (x, y, l) min (x + y, l)' – HaagenDaz

+0

Vorausgesetzt, dass '' 'l''' ist eine Konstante Fügen Sie es einfach zur Betreiberliste hinzu. – DGKarlsson

0

manuell, können Sie die folgenden nur tun können: (Ich habe gerade ein anderes Beispiel)

df1<-array(c(1:21), dim=c(3,7)) 

df3<-df1+10 
df4<-df1-7 
df5<-df1*2 
+1

Das ist nicht richtig. – Sotos