我有一个名为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行的表的列表,所以如果有人知道可以更快地执行此任务的方法,我很想听听你的想法。
感谢您的帮助!
答案 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