R中0-1 sum与1之间的所有值组合

时间:2013-10-13 11:21:28

标签: r

简单的问题:我正在努力获得3个数字(在0.1和0.9之间)的权重总和为1的所有组合。

示例:

c(0.20,0.20,0.60)
c(0.35,0.15,0.50)
.................

重量相差0.05

我试过这个:

library(gregmisc)
permutations(n = 9, r = 3, v = seq(0.1,0.9,0.05))

combn(seq(0.1,0.9,0.05),c(3))

但是我需要3个数字(权重)等于1,我该怎么做?

2 个答案:

答案 0 :(得分:6)

x <- expand.grid(seq(0.1,1,0.05),
                 seq(0.1,1,0.05),
                 seq(0.1,1,0.05))

x&lt; - x [rowSums(x)== 1,]

编辑:改用此选项以避免浮点错误:

x <- x[abs(rowSums(x)-1) < .Machine$double.eps ^ 0.5,]

#if order doesn't matter
unique(apply(x,1,sort), MARGIN=2)
#      15   33  51   69  87  105 123  141  393  411  429  447  465  483 771  789 807  825 #843 1149 1167 1185 1527 1545
#[1,] 0.1 0.10 0.1 0.10 0.1 0.10 0.1 0.10 0.15 0.15 0.15 0.15 0.15 0.15 0.2 0.20 0.2 0.20 0.2 0.25 0.25 0.25  0.3 0.30
#[2,] 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.15 0.20 0.25 0.30 0.35 0.40 0.2 0.25 0.3 0.35 0.4 0.25 0.30 0.35  0.3 0.35
#[3,] 0.8 0.75 0.7 0.65 0.6 0.55 0.5 0.45 0.70 0.65 0.60 0.55 0.50 0.45 0.6 0.55 0.5 0.45 0.4 0.50 0.45 0.40  0.4 0.35

如果可能的组合数量变得很大,这将遇到性能和内存问题。

答案 1 :(得分:0)

这对我来说是一个更容易理解的解决方案:

x_grid <- data.frame(expand.grid(seq(0.1,1,0.05),
             seq(0.1,1,0.05),
             seq(0.1,1,0.05)))

x_combinations <- x[rowSums(x_grid) == 1, ]