我的输入是
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对:我想将每个列的条目相乘并将它们合并为一个最终答案,例如 -
(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
我怎么能用R做到这一点?非常感谢您的评论。
答案 0 :(得分:3)
combn
创建所需的所有组合。 t
用于转换矩阵,就像您希望格式化矩阵一样。apply
迭代在步骤1中创建的索引。请注意,我们使用否定索引,因此我们不会尝试对Row列求和。`
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))