2012-03-09 89 views
0

我试图根据每个列中的值合并r中的两个数据框。在R中的一个条件乘以另一个data.frame中列的一个data.frame中的列值

df1=data.frame(comp=c("comp1", "comp2", "comp3","comp1"), 
state1=c(1,0,0,1), 
state2=c(1,1,0,1), 
state3=c(0,1,1,0), 
state4=c(0,0,1,0),year=c(1,1,1,2)) 

    comp state1 state2 state3 state4 year 
1 comp1  1  1  0  0 1 
2 comp2  0  1  1  0 1 
3 comp3  0  0  1  1 1 
4 comp1  1  1  0  0 2 

df2=data.frame(state=c("state1","state2", "state3", "state4", 
         "state1","state2", "state3", "state4"), 
var1=c(1,0,0,1,0,0,1,1), 
var2=c(0,1,0,0,0,1,1,0), 
year=c(1,1,1,1,2,2,2,2)) 

DF2

state var1 var2 year 
1 state1 1 0 1 
2 state2 0 1 1 
3 state3 0 0 1 
4 state4 1 0 1 
5 state1 0 1 2 
6 state2 0 1 2 
7 state3 1 1 2 
8 state4 1 0 2 

我想追加列DF1是VAR1,VAR2这对于补偿所有国家的平均值。因此,对于comp1,var1应该是1 * 1 + 1 * 0 + 0 * 0 + 0 * 1 /(1 + 1)或state * var/sum(comp的状态)。

DF3会是什么样子:

  state1 state2 state3 state4 year var1 var2 
    1 comp1 1  1  0  0  1 0.5 0.5 
    2 comp2 0  1  1  0  1 0.0 0.5 
    3 comp3 0  0  1  1  1 0.5 0.0 
    4 comp1 1  1  0  0  2 0.5 1.0 

这可能吗?我试着用平均值为var1的ddply,按comp和year来总结,但这不起作用。每年最终我会得到不止一行。

在此先感谢。 这一个与我的问题最相似,但它没有在第二个数据集中显示条件。 Multiply various subsets of a data frame by different vectors

请指教。

回答

1

我的希望是,通过打破成段这个你可以找出为什么我的结果看起来比你的预测不同:

df3 <- matrix(NA, ncol=2, nrow=nrow(df1)) 
for (i in seq(nrow(df1))) { 
    df3[i, 1] <- sum(df2[ df2$year==df1$year[i], "var1"] * df1[i, 2:5]) 
    df3[i, 2] <- sum(df2[ df2$year==df1$year[i], "var2"] * df1[i, 2:5]) 
} 
m4<-df3/rowSums(df1[2:5]) 
cbind(df1, m4) 
#--------------- 
    comp state1 state2 state3 state4 year 1   2 
1 comp1  1  1  0  0 1 0.5 0.5000000 
2 comp2  0  1  1  0 1 0.0 0.3333333 
3 comp3  0  0  1  1 1 0.5 0.0000000 
4 comp1  1  1  0  0 2 0.0 0.3333333 

似乎匹配OK的“VAR1”的条目,我希望你只扔了一些“var2”的猜测。

+0

谢谢。我只是猜测Var2的一些猜测。我试图重现你的结果,我得到:错误在df3 [i,1] < - sum(df2 [df2 $ year == df1 $ year [i],“var1”] * df1 [i,: 对象'df3'没有找到 – jessi 2012-03-09 20:49:57

+0

原来的'm3'应该是'df3',我会修复它,如果没有其他人首先得到它。另外,我认为该行应该是'm4 <-df3/rowSums(df1 [2:5])'如果我理解你的分母计算 – 2012-03-09 21:02:13

+0

这是一个简单的解决方案,我真的很感谢你为我设置这个,我认为顺序可能很重要,所以我认为我需要整理我的原始数据以反映例如。再次感谢 – jessi 2012-03-09 21:08:56

相关问题