我正在研究如何找到两个数据帧的产品总和。
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 中的每一行,等等
一般如何做到这一点
谢谢
答案 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