My input is
df1 <- data.frame(Row=c("row1", "row2", "row3", "row4", "row5"),
A=c(1,2,3,5.5,5),
B=c(2,2,2,2,0.5),
C= c(1.5,0,0,2.1,3))
# Row1 1 2 1.5
# Row2 2 2 0
# Row3 3 2 0
# Row4 5.5 2 2.1
# Row5 5 0.5 3
(1*2) + (2*2)+ (1.5 *0)
6
(1*3) + (2*2) + (1.5*0)
7
row1 row2 6
row1 row3 7
row1 row4 12.65
row1 row5 10.5
row2 row3 10
row2 row4 15
row2 row5 11
row3 row4 20.5
row3 row5 16
row4 row5 34.8
combn
. t
is used to transpose the matrix as you expect it to be formatted.apply
to iterate over the indices created in step 1. Note that we use negative indexing so we don't try to sum the Row column.`
ind <- t(combn(nrow(df1),2))
out <- apply(ind, 1, function(x) sum(df1[x[1], -1] * df1[x[2], -1]))
cbind(ind, out)
out
[1,] 1 2 6.00
[2,] 1 3 7.00
[3,] 1 4 12.65
.....