2014-11-06 3 views
0

Я работаю в R и у меня есть два набора данных. Один набор данных содержит сумму вклада, а другой включает флаг include/exclude. Ниже приведены данные:Умножение значений в том же положении в R

> contr_df 
    asof_dt X   Y 
1 2014-11-03 0.3   1.2 
2 2014-11-04 -0.5   2.3 
3 2014-11-05 1.2   0.4 
> inex_flag 
     asof_dt X Y 
1 2014-11-03 1 0 
2 2014-11-04 1 1 
3 2014-11-05 0 0 

Я хотел бы создать 3-й набор данных, которые показывают один умноженное на другой. Например, я хочу, чтобы увидеть следующую

2014-11-03 0.3 * 1  1.2*0 
2014-11-04 -0.5*1   2.3*1 
2014-11-05 1.2*0   0.4*0 

Пока единственный способ, которым я был в состоянии сделать это через используя цикл, который перебирает общее число столбцов. Однако это сложно и неэффективно. Мне было интересно, есть ли более простой способ сделать это. Кто-нибудь знает о лучшем решении?

ответ

3

Это делает умножение, но не имеет смысла для факторов:

df1 * df2 
# asof_dt X Y 
#1  NA 0.3 0.0 
#2  NA -0.5 2.3 
#3  NA 0.0 0.0 
#Warning message: 
#In Ops.factor(left, right) : * nicht sinnvoll für Faktoren 

Один вариант: Вы можете cbind первый столбец и умноженные значения, как это:

cbind(df1[1], df1[-1] * df2[-1]) 
#  asof_dt X Y 
#1 2014-11-03 0.3 0.0 
#2 2014-11-04 -0.5 2.3 
#3 2014-11-05 0.0 0.0 

Это означает, , вы умножаете df1 и df2 без их первого столбца каждого кадра данных и добавляете к нему первый столбец df1 с датами.

2

Однолинейный Ответ:

mapply(`*`, contr_df, inex_flag) 

Это парное применить скалярную функцию умножения по столбцам data.frame.

d = data.frame(a=c(1,2,3), b=c(0,2,-1)) 
e = data.frame(a=c(.2, 2, -1), b=c(0, 2, -2)) 
mapply(`*`, d, e) 
     a b 
[1,] 0.2 0 
[2,] 4.0 4 
[3,] -3.0 2 
Смежные вопросы