psiu - 4 years ago 164

R Question

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))

It look like this:

`# Row1 1 2 1.5`

# Row2 2 2 0

# Row3 3 2 0

# Row4 5.5 2 2.1

# Row5 5 0.5 3

I want to get the sum of all these pairs of rows, with the following equation. Let's said for Row1 and Row2 pairs: I want to multiply each column's entry and sum them into one final answer, for example-

- Row1-Row2 answer is =
`(1*2) + (2*2)+ (1.5 *0)`

`6`

- Row1-Row3 answer is =
`(1*3) + (2*2) + (1.5*0)`

`7`

I want to do all analysis for each pairs of row and get a result data frame like this:

`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

How can I do this with R? Thanks a lot for comments.

Recommended for you: Get network issues from **WhatsUp Gold**. **Not end users.**

Answer Source

- Create all the combinations you need with
`combn`

.`t`

is used to transpose the matrix as you expect it to be formatted. - Use
`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. - Bind the two results together.

`

```
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
.....
```

Recommended from our users: **Dynamic Network Monitoring from WhatsUp Gold from IPSwitch**. ** Free Download**