2016-08-29 17 views
0

私は2つのデータフレームxとyを持っています。2つのデータフレームを使用して条件文を適用する

x<-data.frame("j"=c("A","B","C"),"k"=c(1,90,14)) 
    x j k 
    1 A 1 
    2 B 90 
    3 C 14 

y<-data.frame("A"=c(1,0,0,1,1),"B"=c(0,1,0,0,1),"C"=c(1,1,1,0,0)) 
    A B C 
1 1 0 1 
2 0 1 1 
3 0 0 1 
4 1 0 0 
5 1 1 0 

私は、データセットのyに0が-1で交換するか、1列Aに1で置き換えるというように、この結果を得るために存在する場合に条件文と関数が必要です。

z<-data.frame("A"=c(1,-1,-1,1,1),"B"=c(-90,90,-90,-90,90),"C"=c(14,14,14,-14,-14)) 
    A B C 
1 1 -90 14 
2 -1 90 14 
3 -1 -90 14 
4 1 -90 -14 
5 1 90 -14 
+0

0を-1に置き換えると、基本的に乗算になります。 '( - (y == 0)+ y)*行列(x $ k、nrow(y)、ncol(y)、byrow = TRUE)' – alistaire

+0

pfの列と行の順序がxとyの間で一致する場合、 'y [y == 0] < - -1; y * x $ k [col(y)] ' – user20650

答えて

1

ここには、よく知られている多くの機能を使用する楽しい1連のRがあります。

setNames(do.call(data.frame, Map(function(x, y) x * c(-1, 1)[y+1], x$k, y)), LETTERS[1:3]) 
    A B C 
1 1 -90 14 
2 -1 90 14 
3 -1 -90 14 
4 1 -90 -14 
5 1 90 -14 

最も内側の関数x * c(-1, 1)[y+1]は、xの値をとる(スカラーである - 1、90、又は14のいずれか)とyの値に応じて負-1または1のいずれかを乗算。

Mapは、xにはx $の値をとり、yにはdata.frame yの変数をとり、各ペアで関数を実行してリストを返します。 3つのベクトルで。

このリストはdo.callのdata.frameに変換され、変数の名前はsetNamesで与えられます。

+0

applyかlapplyとifelseを使ってこれらの結果を得る方法はありますか? –

+1

'Map'は' mapply'のラッパーです。 'ifelse'はかなり遅くなりがちですが、' c(-1、1)[y + 1] 'は実際に' ifelse'の役割を果たしていますが、より高速です。 'ifelse'バージョンは' ifelse(y == 1、y、-1) 'でしょう。 – lmo

関連する問題