我需要使用8个变量得到总和等于100的所有组合,这些变量可以通过10的增量步长从0到100取任何值。(即0,10,20 ...... 100)
以下脚本就是这样做但效率非常低,因为它创建了一个巨大的数据集,我想知道是否有人有更好的方法来做到这一点。
x <- expand.grid("ON" = seq (0,100,10),
"3M" = seq(0,100,10),
"6M" = seq(0,100,10),
"1Y" = seq(0,100,10),
"2Y" = seq(0,100,10),
"5Y" = seq(0,100,10),
"10Y" = seq(0,100,10),
"15Y" = seq(0,100,10))
x <- x[rowSums(x)==100,]
编辑 -
回答StéphaneLaurent提出的问题
结果应该看起来像
ON 3M 6M 1Y 2Y 5Y 10Y 15Y
100 0 0 0 0 0 0 0
90 10 0 0 0 0 0 0
80 20 0 0 0 0 0 0
70 30 0 0 0 0 0 0
60 40 0 0 0 0 0 0
50 50 0 0 0 0 0 0
(...)
0 0 0 0 0 0 10 90
0 0 0 0 0 0 0 100
答案 0 :(得分:4)
uniqueperm2
函数here获得超快的解决方案。
library(partitions)
C = t(restrictedparts(10,8))
do.call(rbind, lapply(1:nrow(C),function(i)uniqueperm2(C[i,])))
更新,使用iterpc
软件包可以获得更快的解决方案。
library(partitions)
library(iterpc)
C = t(restrictedparts(10,8))
do.call(rbind, lapply(1:nrow(C),function(i) getall(iterpc(table(C[i,]), order=T))))
速度约为uniqueperm2
> f <- function(){
do.call(rbind, lapply(1:nrow(C),function(i)uniqueperm2(C[i,])))
}
> g <- function(){
do.call(rbind, lapply(1:nrow(C),function(i) getall(iterpc(table(C[i,]), order=T))))
}
> microbenchmark(f(),g())
Unit: milliseconds
expr min lq mean median uq max neval cld
f() 36.37215 38.04941 40.43063 40.07220 42.29389 46.92574 100 b
g() 16.77462 17.45665 19.46206 18.10101 20.65524 64.11858 100 a
答案 1 :(得分:3)
这是你想要的:
> library(partitions)
> 10*restrictedparts(10,8)
[1,] 100 90 80 70 60 50 80 70 60 50 60 50 40 40 70 60 50 40 50 40 30 40 30 60 50 40 40 30 30 20 50 40 30 30 20 40 30 20 30 20
[2,] 0 10 20 30 40 50 10 20 30 40 20 30 40 30 10 20 30 40 20 30 30 20 30 10 20 30 20 30 20 20 10 20 30 20 20 10 20 20 10 20
[3,] 0 0 0 0 0 0 10 10 10 10 20 20 20 30 10 10 10 10 20 20 30 20 20 10 10 10 20 20 20 20 10 10 10 20 20 10 10 20 10 10
[4,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 20 20 10 10 10 10 10 20 20 10 10 10 10 20 10 10 10 10 10
[5,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 20 10 10 10 10 10 10 10 10 10 10
[6,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10
[7,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10
[8,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10
答案 2 :(得分:1)
::before
程序包包含功能partitions
,该功能完全符合OP的要求。
compositions()
另请参阅@Joseph Woods Finding A List of All Combinations of 6 Numbers That Add up to 10