我想要总结矩阵中所有可能的行组合。一个类似于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
我可以为更大的矩阵编写更简洁的代码吗?
答案 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)