【问题标题】:Multiply column values in one data.frame by column in another data.frame on a condition in R在R中的条件下,将一个data.frame中的列值乘以另一个data.frame中的列
【发布时间】:2012-03-27 04:43:50
【问题描述】:

我在 r 中有两个数据框,我试图根据每个数据框的列中的值进行组合。

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(state for 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

这可能吗?我尝试将 ddply 与 var1 的平均值一起使用,按 comp 和 year 进行总结,但这不起作用。我最终每年每个比赛都会有不止一行。

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

请指教。

【问题讨论】:

    标签: r dataframe


    【解决方案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
    

    似乎与“var1”条目相匹配,我希望您只是对“var2”进行一些猜测。

    【讨论】:

    • 谢谢。我只是对 Var2 进行了一些猜测。我试图重现你的结果,我得到: df3[i, 1]
    • 原来的m3应该是df3,如果没有其他人先得到它,我会修复它。另外,如果我理解您的分母计算,我认为该行应该是m4&lt;-df3/rowSums(df1[2:5])
    • 多么简单的解决方案。我真的很感谢你为我设置了这个。我认为顺序可能很重要,所以我认为我需要对原始数据进行排序以反映示例。再次感谢。
    • 感谢您的编辑,@BrianDiggs。我也不太清楚正确的分母。
    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多