如何将Matrix中所有行的组合相加?

时间:2017-10-16 05:45:33

标签: r matrix

我想要总结矩阵中所有可能的行组合。一个类似于rowSums()函数的函数,但它不会产生nrow()和,而是产生nrow() ^ nrow()个和。

例如:

set.seed(10)
dummymat <-  matrix(floor(runif(9, 0, 2)), nrow = 3, ncol = 3)

生成矩阵:

     [,1] [,2] [,3]
[1,]    1    1    0
[2,]    0    0    0
[3,]    0    0    1

要查找矩阵的每个可能的行和,可以编写以下非常低效的代码:

allrowsums <- c()

for(i in 1:nrow(dummymat)) {
  firstcolval <- dummymat[i,1]
  for(j in 1:nrow(dummymat)) {
    secondcolval <- dummymat[j,2]
    for(k in 1:nrow(dummymat)) {
      thirdcolval <- dummymat[k,3]
      rowsum <- firstcolval + secondcolval + thirdcolval
      allrowsums <- append(allrowsums,rowsum)
  }
 }
}

其中给出了以下输出:

[1] 2 2 3 1 1 2 1 1 2 1 1 2 0 0 1 0 0 1 1 1 2 0 0 1 0 0 1

我可以为更大的矩阵编写更简洁的代码吗?

1 个答案:

答案 0 :(得分:4)

您可以使用expand.grid创建列式元素的所有组合的数据框。

dummymat_expand <- expand.grid(x=dummymat[,1], y=dummymat[,2], z=dummymat[,3])

从这里开始,您只需调用rowSums即可获得所有可能的总和组合。

rowSums(dummymat_expand)

编辑回答问题。要将代码应用于具有可变列长度的矩阵,请注意expand.grid可以将向量,因子或列表作为输入。因此,您可以创建要添加到expand.grid

的列元素列表
# create a list of column elements
dummymat_column_list <- lapply(1:ncol(dummymat), function(x) dummymat[, x])
expand.grid(dummymat_column_list)