生成m个等间距数字,在R中总和为1

时间:2016-11-18 15:55:00

标签: r

鉴于m,我们如何生成m等间距数字,其总和为1,以便A1 > A2 > ... > Am

例如,如果m=4那么我们应该:

a <- c(0.4, 0.3, 0.2, 0.1)

abs(diff(a))
#[1] 0.1 0.1 0.1

sum(a)
#[1] 1

m=5

b <- c(0.30, 0.25, 0.20, 0.15, 0.10)

abs(diff(b))
#[1] 0.05 0.05 0.05 0.05

sum(b)
#[1]

2 个答案:

答案 0 :(得分:9)

怎么样:

rev(seq_len(m)/sum(seq_len(m)))

a <- rev(seq_len(4)/sum(seq_len(4)))
##[1] 0.4 0.3 0.2 0.1
abs(diff(a))
##[1] 0.1 0.1 0.1
sum(a)
##[1] 1

b <- rev(seq_len(5)/sum(seq_len(5)))
##[1] 0.33333333 0.26666667 0.20000000 0.13333333 0.06666667
abs(diff(b))
##[1] 0.06666667 0.06666667 0.06666667 0.06666667
sum(b)
##[1] 1

答案 1 :(得分:4)

如果您想要一个可调节的空间或起点,您可以使用公式根据起点或起点根据空间计算空间:

场景1 :可调整的起点:

m = 5; s = 0.9

seq(from = s, by = -(m*s - 1) * 2/((m - 1) * m), length.out = m)
#[1]  0.90  0.55  0.20 -0.15 -0.50

sum(seq(from = s, by = -(m*s - 1) * 2/((m - 1) * m), length.out = m))
#[1] 1

场景2 :可调节空间:

m = 5; d = 0.2

seq(from = 1/m + ((m - 1) * d/2), by = -d, length.out = m)
# [1]  0.6  0.4  0.2  0.0 -0.2

sum(seq(from = 1/m + ((m - 1) * d/2), by = -d, length.out = m))
# [1] 1