我正在寻找一个矩阵中所有可能的行组合。一个类似于rowSums()函数但不产生nrow()和的函数,它将产生nrow() ^ nrow()和。
例如:
set.seed(10)
dummymat <- matrix(floor(runif(9, 0, 2)), nrow = 3, ncol = 3)
Run Code Online (Sandbox Code Playgroud)
产生矩阵:
[,1] [,2] [,3]
[1,] 1 1 0
[2,] 0 0 0
[3,] 0 0 1
Run Code Online (Sandbox Code Playgroud)
为了找到矩阵的每个可能的行总和,可以编写以下效率很低的代码:
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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
[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
Run Code Online (Sandbox Code Playgroud)
我可以为更大的矩阵编写哪些更简洁的代码?
您可以expand.grid用来创建列元素的所有组合的数据框。
dummymat_expand <- expand.grid(x=dummymat[,1], y=dummymat[,2], z=dummymat[,3])
Run Code Online (Sandbox Code Playgroud)
在这里,您只需调用rowSums即可获取所有可能的总和组合。
rowSums(dummymat_expand)
Run Code Online (Sandbox Code Playgroud)
编辑回答问题。要将代码应用于具有可变列长的矩阵,请注意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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
815 次 |
| 最近记录: |