【发布时间】:2021-06-11 09:45:20
【问题描述】:
我的一个朋友最近问我是否可以在 R 中创建一个由 step 分隔的 N 数字列表,总和为 1。例如,向量 seq(0.1,1,0.1) 中 3 个数字的所有可能组合这个总和 1. 顺序并不重要。
我一直在使用expand.grid,但随着数量的增加,内存需求会激增。由于顺序并不重要,我们认为只考虑一些组合来减少矩阵。如果我们让 111 代表值c(0.1,0.1,0.1),而 123 代表 c(0.1,0.2,0.3),我们只考虑 111、112、113 ... 119、122、123、... 129、133 ... 等。
请注意,我们排除了 121、131 和 132,因为它们等同于 112、113 和 123。这大大减少了要测试的组合数量。为此,我们使用了嵌套的 for 循环,如下所示:
step=.1
lst=list()
for(i in seq(step,1,step)){
for(j in seq(i,1,step)){
for(k in seq(j,1,step)){
print(c(i,j,k));if(sum(c(i,j,k))==1){lst=append(lst,list(c(i,j,k)))}
}
}
}
do.call("rbind",lst)
这可行,但我想让它更灵活。现在,要比较 4 个数字而不是 3 个,我需要编写一个新的 for 循环。我在想像all_comb(vector, N) 这样的函数,它相当于上面的嵌套循环,但我找不到它,也不知道如何优雅地实现它。
谢谢!
【问题讨论】:
标签: r