用R求和成对行?

时间:2011-07-24 01:55:04

标签: r row sum

我的输入是

 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

我希望得到所有这些行对的总和,使用以下等式。让我们说Row1和Row2对:我想将每个列的条目相乘并将它们合并为一个最终答案,例如 -

  • Row1-Row2答案为(1*2) + (2*2)+ (1.5 *0) = 6
  • Row1-Row3答案为(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

我怎么能用R做到这一点?非常感谢您的评论。

2 个答案:

答案 0 :(得分:3)

  1. 使用combn创建所需的所有组合。 t用于转换矩阵,就像您希望格式化矩阵一样。
  2. 使用apply迭代在步骤1中创建的索引。请注意,我们使用否定索引,因此我们不会尝试对Row列求和。
  3. 将两个结果捆绑在一起。
  4. `

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

答案 1 :(得分:2)

是的!这是一个矩阵乘法! : - ))

首先,只是准备矩阵:

m = as.matrix(df1[,2:4])
row.names(m) = df1$Row

这就是操作,多么容易!

m %*% t(m)

就是这样!

一个提示 - 您可以通过这种方式定义data.frame,它将为您节省row.names命令:

df1 <- data.frame(row.names=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))