2015-02-07 94 views
0

我正在研究如何找到两个数据框产品的总和。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 

等了数据中的每一行2

如何在一般

感谢为此

回答

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

或'tcrossprod(unlist(data),as.matrix(data2))' – akrun 2015-02-07 11:18:33

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 

编辑如果你想要得到的总和○:在这种情况下的列表)处理f起上述矩阵的每一行,你可以使用apply(tmp, 1, sum)rowSums

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