2017-11-09 10 views
2

dfの複数の列に別のdfの列を掛けたいとします。data.frameに条件を満たす列を掛けてください。

df1とdf2には「year_quarter」という列があります。 df1の多くの列にdf2の列を掛けて、year_quarterが一致するようにします。

DF1

year_quarter col1 col2 col3 
2010Q1   5  0.34 0.45 
2010Q1   4  0.45 0.34 
2010Q1   6  0.63 0.86 
2010Q1   2  0.75 0.45 
2010Q2   3  0.78 0.27 
2010Q2   5  0.43 0.38 
2010Q2   2  0.34 0.74 
2010Q2   1  0.87 0.35 
2010Q3   5  0.34 0.45 
2010Q3   8  0.54 0.42 
2010Q3   9  0.23 0.45 
2010Q3   3  0.74 0.34 
2010Q4   2  0.72 0.78 
2010Q4   7  0.62 0.91 
2010Q4   2  0.74 0.10 
2010Q4   6  0.73 0.09 

DF2

year_quarter ratio 
2010Q1   0.96 
2010Q2   1.34 
2010Q3   1.92 
2010Q4   0.74 

私はyear_quarterは、両方のDFSに一致するDF2における比でDF1にCOL1、COL2とCOL3を乗算します。つまり、df1 = 2010Q1のquarter_yearの場合、2010Q1のすべてのインスタンスに対してcol1、col2およびcol3に0.96を掛けなければなりません。

+0

不一致がある場合の動作は何ですかdf1に4分の1があり、df2には表示されないとします。出来ますか? – agenis

+0

df1には存在するが、df2には存在しない四半期の名前を印刷したいのですか? –

答えて

4

matchを使用してこれを行うことができます。両方のデータフレームから同様の列を照合し、対応するratioの値を取得し、それに1列目を除いてdf1を掛けます。あなたがそれを必要としない場合

df2$ratio[match(df1$year_quarter, df2$year_quarter)] * df1[-1] 


# col1 col2 col3 
#1 4.80 0.3264 0.4320 
#2 3.84 0.4320 0.3264 
#3 5.76 0.6048 0.8256 
#4 1.92 0.7200 0.4320 
#5 4.02 1.0452 0.3618 
#6 6.70 0.5762 0.5092 
#7 2.68 0.4556 0.9916 
#8 1.34 1.1658 0.4690 
#9 9.60 0.6528 0.8640 
#10 15.36 1.0368 0.8064 
#11 17.28 0.4416 0.8640 
#12 5.76 1.4208 0.6528 
#13 1.48 0.5328 0.5772 
#14 5.18 0.4588 0.6734 
#15 1.48 0.5476 0.0740 
#16 4.44 0.5402 0.0666 
1

使用dplyr、あなたは両方のデータセットをマージし、目的の列の値を変更するのmutate機能を適用し、最終的にあなたは比列を削除することができます%>% select(-ratio)

library(dplyr) 
left_join(df1, df2) %>% mutate_at(vars(starts_with("col")), funs(.*ratio)) 

左の結合の振る舞いは、たとえば、最初のdata.frameに2011年の日付があると、行NAを残します(Ronakの答えで同じ動作)

+0

私は 'sweep'関数を使うこともできると思いますが、それほど簡単ではありません – agenis

関連する問題