R编程(产品总和)

时间:2015-02-07 09:57:00

标签: r

我正在研究如何找到两个数据帧的产品总和。

data<-w1 w2 w3 w4
      4   6  8  5

其中w1 w2 w3 w4是列名

我还有一个数据框

data2<-p1 p2 p3 p4
        3  4  5  6
        5  6  8  4
        4  6  6  8
        3  5  8  9

我的结果应该是这样的:

result <- w1*P1+w2*p2+w3*p3*w4*p4    

result1 <- 4*3+6*4+8*5+5*6   # result on row 1

result2 <- 4*5+6*6+8*8+5*4   # result on row 2
对于data2

中的每一行,

等等

一般如何做到这一点

谢谢

2 个答案:

答案 0 :(得分:4)

最快的方法是回到R线性代数(更重要的是你有更大的data.frame):

> as.matrix(data2) %*% unlist(data)
#     [,1] 
#[1,]  106
#[2,]  140 
#[3,]  140
#[4,]  151

sweep

> rowSums(sweep(as.matrix(data2), 2, unlist(data), `*`))
#[1] 106 140 140 151

数据

data=data.frame(a=4,b=6,c=8,d=5)
data2=data.frame(a=c(3,5,4,3),b=c(4,6,6,5),c=c(5,8,6,8),d=c(6,4,8,9))

答案 1 :(得分:3)

您可以使用mapply

df1 <- data.frame(w1 = 4, w2 = 6, w3 = 8, w4 = 5)
df2 <- data.frame(p1 = c(3, 5, 4, 3), p2 = c(4, 6, 6, 5), 
                  p3 = c(5, 8, 6, 8), p4 = c(6, 4, 8, 9))

这将df2的每个元素与df1的每个元素相乘(按元素我的意思是列 - 数据帧在此上下文中被视为列表):

> (tmp <- mapply(`*`, df2, df1))
     p1 p2 p3 p4
[1,] 12 24 40 30
[2,] 20 36 64 20
[3,] 16 36 48 40
[4,] 12 30 64 45
>sum(tmp)
[1] 537

修改如果您想从上面的矩阵中获取每一行的总和,您可以使用apply(tmp, 1, sum)rowSums

> rowSums(tmp)
[1] 106 140 140 151