这是一个很好的问题,答案不是很明显。
这里有很多事情要解决。对于初学者,请确保包含您在示例中使用的库。我从经验中知道您正在使用partitions
and iterpc
。从partitions
文档中,我们看到有一个函数可以准确地返回您正在寻找的内容,而无需任何额外的步骤。它是compositions
生成Integer Compositions的函数。
myComps <- t(as.matrix(compositions(10, 6)))
head(myComps)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 10 0 0 0 0 0
[2,] 9 1 0 0 0 0
[3,] 8 2 0 0 0 0
[4,] 7 3 0 0 0 0
[5,] 6 4 0 0 0 0
[6,] 5 5 0 0 0 0
dim(myComps)
[1] 3003 6
all(rowSums(myComps) == 10)
[1] TRUE
至于修复您的实际代码,我不确定为什么您的代码不能按原样工作。我过去使用iterpc
过并且记得明确使用相同的方法。无论如何,解决方法是显式声明labels
参数,因为使用每个元素的频率而不是值本身。
## The 1's should be 0's and the 2's should be 10's
ComboSet[1:6, ]
X1 X2 X3 X4 X5 X6
1 1 1 1 1 1 2
2 1 1 1 1 2 1
3 1 1 1 2 1 1
4 1 1 2 1 1 1
5 1 2 1 1 1 1
6 2 1 1 1 1 1
## OP's original code
ComboSet<-data.frame(do.call(rbind, lapply(1:nrow(C),function(i) getall(iterpc(table(C[i,]), order=T)))))
all(rowSums(ComboSet) == 10)
[1] FALSE
table(rowSums(ComboSet))
7 8 9 10 11 12 13 14 15 16
12 30 150 255 186 690 420 420 180 660
## Here is the fix with labels explicitly declared
ComboSetFix <- data.frame(do.call(rbind, lapply(1:nrow(C), function(i) {
getall(iterpc(table(C[i,]), labels = as.integer(names(table(C[i,]))), order=T))
})))
all(rowSums(ComboSetFix) == 10)
[1] TRUE
dim(ComboSetFix)
[1] 3003 6
您应该知道它iterpc
没有得到积极维护,并鼓励用户切换到arrangements
. 它有一个不同的界面,所以你不能简单地将“iterpc”这个词替换为“arrangements”。