首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找6个数字加起来等于10的所有组合的列表

查找6个数字加起来等于10的所有组合的列表
EN

Stack Overflow用户
提问于 2019-10-15 04:53:26
回答 1查看 169关注 0票数 2

因此,我以前看到过类似版本的这个问题(Getting all combinations which sum up to 100 using R),但我正在努力找到一种方法来确定我需要具体运行什么。我尝试在R中创建一个列表,其中包含6个数字加起来为10的所有不同组合。但是,我想在行中包括0和相同#的重复。所以它看起来像这样:

10 0 0 0 0 0 9 1 0 0 0 0 8 2 0 0 0 0我尝试过运行以下命令:

代码语言:javascript
复制
C = t(restrictedparts(10,6, include.zero=TRUE))
ComboSet<-data.frame(do.call(rbind, lapply(1:nrow(C),function(i) getall(iterpc(table(C[i,]), order=T)))))

然而,当我这样做时,它似乎不包括其中包含0的变体。我已经尝试在我正在运行的程序的不同部分中输入include.zero=TRUE函数,但到目前为止还没有成功。有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2019-10-15 08:47:25

这是一个很好的问题,答案并不是很明显。

这里有很多事情要解决。对于初学者,请确保包含示例中使用的库。根据我的经验,我知道您正在使用partitionsiterpc。从partitions文档中,我们可以看到有一个函数可以精确地返回您正在查找的内容,而不需要任何额外的步骤。生成Integer Compositions的是compositions函数。

代码语言:javascript
复制
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参数,因为使用的是每个元素的频率,而不是值本身。

代码语言:javascript
复制
## 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”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58383926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档