生成总和为1的值组合,按降序排序

时间:2015-07-28 09:44:41

标签: r

您是否知道一种更有效的方法来生成一个矩阵,该矩阵包含&#34;权重&#34;的所有独特组合。 (权重为w且0 <= w <= 1,并且w的值以0.1的步长分开),使得权重总和为1,第一个是最高,最后一个是最低权重。

这是完成工作的代码,但删除行似乎效率低下:

# generate combinations of weights such that w1 >= w2 >= w3 ...
w = seq(0, 1, 0.1) #weights 0, 0.1, ..., 0.9, 1
w = expand.grid(w, w, w, KEEP.OUT.ATTRS = FALSE) #all combinations of 3 weights
w = w[rowSums(w) == 1, ] #make sure the weights sum to one
w = w[!(w[, 1] < w[, 2] | w[, 2] < w[, 3]),] #make sure w1 >= w2 >= w3 ...

w    
#     Var1 Var2 Var3
# 11   1.0  0.0  0.0
# 21   0.9  0.1  0.0
# 31   0.8  0.2  0.0
# 41   0.7  0.3  0.0
# 51   0.6  0.4  0.0
# 61   0.5  0.5  0.0
# 141  0.8  0.1  0.1
# 151  0.7  0.2  0.1
# 171  0.5  0.4  0.1
# 271  0.6  0.2  0.2
# 281  0.5  0.3  0.2
# 291  0.4  0.4  0.2
# 401  0.4  0.3  0.3

让我添加一些更一般的信息: 在这个问题中(按上述顺序为3个权重),第一个,第二个,第三个值的上限如下:

  • 对于组合(1,0,0)
  • ,第一个数字最小可以为1
  • 组合的第二个数字最大可以是1/2(1/2,1 / 2,0)
  • 组合的第三个数字最大可以是1/3(1 / 3,1 / 3,1 / 3)

2 个答案:

答案 0 :(得分:4)

base可能性:

library(partitions)

step <- 0.1
n_weights <- 3

t(restrictedparts(n = 1/step, m = n_weights) * step)
#  [1,] 1.0 0.0 0.0
#  [2,] 0.9 0.1 0.0
#  [3,] 0.8 0.2 0.0
#  [4,] 0.7 0.3 0.0
#  [5,] 0.6 0.4 0.0
#  [6,] 0.5 0.5 0.0
#  [7,] 0.8 0.1 0.1
#  [8,] 0.7 0.2 0.1
#  [9,] 0.6 0.3 0.1
# [10,] 0.5 0.4 0.1
# [11,] 0.6 0.2 0.2
# [12,] 0.5 0.3 0.2
# [13,] 0.4 0.4 0.2
# [14,] 0.4 0.3 0.3

答案 1 :(得分:1)

标准包装的通用功能:

# Generate weights matrix with noWeights columns and noRows rows.
# Each row of this matrix contains sorted decremental weights summing up to 1.0.
generateWeights = function(noWeights,
                           noRows,
                           distribution = runif,
                           rounding = function(x){ round(x, 1) })
{
  generator = function()
  {
    x = distribution (noWeights);
    x = x/sum(x);
    sort(rounding(x), decreasing = T)
  } 
  t(replicate(noRows, generator()))
}

# example of use
generateWeights(3, 10)