循环遍历矩阵中行行的所有组合

时间:2015-07-10 20:19:01

标签: r

我有一个名为Dataset的矩阵,其中包含如下所示的高吞吐量数据:

     V1 V2 V3
 A   2  3  3     
 B   4  2  7
 C   3  1  4

我想要做的是以列表的形式查找此矩阵的所有行产品组合,如下所示(我将其称为Comb):

      V1 V2 V3
A A   4  9  9
A B   8  6  21
A C   6  3  12
B B   16 4  49  
B C   12 2  28
C C   9  1  16

到目前为止我的内容如下:

combs <- combn(seq_len(nrow(Dataset)), 2)
Comb <- Dataset[combs[1,], ] * Dataset[combs[2,], ]
rownames(Comb) <- apply(combn(rownames(Dataset), 2), 2, paste, collapse = " ")

不幸的是,使用这个脚本的主要问题是我没有得到自己乘以的行的产品。所以使用上面的脚本,我会得到以下矩阵:

      V1 V2 V3
A B   8  6  21
A C   6  3  12
B C   12 2  28

所以我想知道是否可以修改我所拥有的代码,以便将同一行中的值相乘?或者是否会有另一个可能更高效的做到这一点?当我在高吞吐量数据集(相当大)上尝试脚本时,似乎需要几秒钟来输出一个包含1000行的表的列表,所以如果有人知道可以更快地执行此任务的方法,我很想听听你的想法。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

这是对您的实施的最小调整。我们只是为您的combn结果添加您想要的值,然后几乎只使用相同的逻辑:

r.seq <- seq_len(nrow(Dataset))
combs <- matrix(c(combn(r.seq, 2), rep(r.seq, each=2)), nrow=2)  # notice how we add values here
Comb <- Dataset[combs[1,], ] * Dataset[combs[2,], ]
rownames(Comb) <- apply(matrix(rownames(Dataset)[c(combs)], nrow=2), 2, paste, collapse=" ")

产地:

    V1 V2 V3
A B  8  6 21
A C  6  3 12
B C 12  2 28
A A  4  9  9
B B 16  4 49
C C  9  1 16

您也可以按rowname排序。扩展网格的一个优点是,它只计算您想要的组合。

答案 1 :(得分:1)

您可以对行序列('d1')应用expand.grid,使用('d1')列对'df1'行进行子集,乘以。使用outer创建行名称的索引('indx')以删除不需要的行。

d1 <- expand.grid(1:nrow(df1), 1:nrow(df1))
res <- df1[d1[,1],] * df1[d1[,2],]
indx <- outer(rownames(df1), rownames(df1), FUN=paste)
v1 <- indx[upper.tri(indx, diag=TRUE)]
res1 <- res[do.call(paste,expand.grid(rownames(df1), rownames(df1))) %in% v1,]
row.names(res1) <- v1
res1
#   V1 V2 V3 
#A A  4  9  9
#A B  8  6 21
#B B 16  4 49
#A C  6  3 12
#B C 12  2 28
#C C  9  1 16
相关问题