2016-03-23 12 views
-2

df1df2の2つのデータフレームがあります。df2にリストされているシナリオに基づいて3つのデータフレームを作成したいと考えています。したがって、例えばdf2からシナリオ1に基づくはadd10からcoverであり、はdf1である。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 

答えて

1

次の関数は第二引数として最初の引数とdf1としてdf2から1行を取ります。

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 
} 

使用法:

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

'New = function(x、y、l)min(x + y、l)'のような別の関数 'New'が必要な場合、コードがどのように変化するのでしょうか – HaagenDaz

+0

' '' '' 'は定数それを演算子リストに追加するだけです。 – DGKarlsson

0

手動で、あなただけの次の手順を実行することができます(私は別の例を使用)

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

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

これは権利ではありません。 – Sotos

関連する問題