R中的序列组合矩阵

R中的序列组合矩阵,r,combinations,sequence,rowsum,R,Combinations,Sequence,Rowsum,我希望为5个变量创建一个矩阵,这样每个变量从seq(from=0,to=1,length.out=500)和行和(data)=1中取一个值 换句话说,我想知道如何创建一个矩阵来显示所有可能的数字组合,每行的总和为1。如果我理解正确,这至少可以让你找到正确的方向 # Parameters len_vec = 500 # vector length num_col = 5 # number of columns # Creating the values for the matrix using

我希望为5个变量创建一个矩阵,这样每个变量从
seq(from=0,to=1,length.out=500)
行和(data)=1
中取一个值


换句话说,我想知道如何创建一个矩阵来显示所有可能的数字组合,每行的总和为1。如果我理解正确,这至少可以让你找到正确的方向

# Parameters
len_vec = 500 # vector length
num_col = 5 # number of columns

# Creating the values for the matrix using rational numbers between 0 and 1
values <- runif(len_vec*num_col)

# Creating matrix
mat <- matrix(values,ncol = num_col,byrow = T)

# ROunding the matrix to create only 0s and 1s
mat <- round(mat)

# Calculating the sum per row
apply(mat,1,sum)
#参数
len_vec=500#矢量长度
num_col=5#列数
#使用0到1之间的有理数为矩阵创建值

值这里是一个使用循环的迭代解。给你所有可能的数字排列,加起来是1,它们之间的距离是N的倍数。这里的想法是取0到1之间的所有数字(它们之间的距离是N的倍数),然后在每一个新列中包含所有添加时不超过1的数字。冲洗并重复,但在最后一次迭代中除外,在该迭代中,您仅将完成该行的数字与该行的总和相加

就像人们在评论中指出的那样,如果你想要N=1/499*,它会给你一个非常大的矩阵。我注意到,对于N=1/200,它已经花费了大约2,3分钟,所以对于N=1/499,它可能需要太长的时间

*
seq(from=0,to=1,length.out=500)
seq(from=0,to=1,by=1/499)


这正是包
分区
的用途。基本上OP是寻找5个整数的所有可能组合,其总和为499。这可以通过
受限零件轻松实现:

system.time(combsOne <- t(as.matrix(restrictedparts(499, 5))) / 499)
 user  system elapsed 
1.635   0.867   2.502 


head(combsOne)
         [,1]        [,2] [,3] [,4] [,5]
[1,] 1.000000 0.000000000    0    0    0
[2,] 0.997996 0.002004008    0    0    0
[3,] 0.995992 0.004008016    0    0    0
[4,] 0.993988 0.006012024    0    0    0
[5,] 0.991984 0.008016032    0    0    0
[6,] 0.989980 0.010020040    0    0    0

tail(combsOne)
                 [,1]      [,2]      [,3]      [,4]      [,5]
[22849595,] 0.2024048 0.2004008 0.2004008 0.2004008 0.1963928
[22849596,] 0.2064128 0.1983968 0.1983968 0.1983968 0.1983968
[22849597,] 0.2044088 0.2004008 0.1983968 0.1983968 0.1983968
[22849598,] 0.2024048 0.2024048 0.1983968 0.1983968 0.1983968
[22849599,] 0.2024048 0.2004008 0.2004008 0.1983968 0.1983968
[22849600,] 0.2004008 0.2004008 0.2004008 0.2004008 0.1983968

嗨,塞扎,我不确定你的问题是否清楚。是否要使用ony 0和1填充包含5列的矩阵,以便每行的总和为1?这就意味着你需要身份矩阵。对吗?不太对。我试图分配5个向量值,从0到1(在本例中,500个有理数从0到1),并确定所有可能的向量组合,其和为1。换句话说,我将有一个5列少于500^5行的矩阵(在这种情况下,并不是所有的有理数总和都是1)。希望这是有意义的。这将是一个大矩阵…这是一个大矩阵,不能在R。。仅举一个例子
a=expand.grid(rep(list)(seq(0,1,length.out=20)),5))nrow(a[rowSums(a)==1,])`8385。。从20英尺长开始显示。我们有一个矩阵,其中第8385行满足条件,但这是从'nrow(a)`矩阵中获得的,它是
3200000
行。。由于行数呈指数增长,因此不可能有500行的序列。但您可以使用for循环并尝试luck@JosephWood我接受了OP早些时候的评论(在这个荒谬的评论线程中的评论4),即
0 0 0 1
以及
0 0 0 1 0
都将被计算在结果中,这意味着顺序确实重要。也许我误解了,但是是的,我推荐的作文没有充分意识到两者之间的区别。顺序在接受的答案中也很重要(例如,参见Luis答案中的第1行和第6行)。但也许OP可以澄清我的错误。这是一个伟大的方法!我从来没有想过要用循环来做!非常感谢你!
system.time(combsOne <- t(as.matrix(restrictedparts(499, 5))) / 499)
 user  system elapsed 
1.635   0.867   2.502 


head(combsOne)
         [,1]        [,2] [,3] [,4] [,5]
[1,] 1.000000 0.000000000    0    0    0
[2,] 0.997996 0.002004008    0    0    0
[3,] 0.995992 0.004008016    0    0    0
[4,] 0.993988 0.006012024    0    0    0
[5,] 0.991984 0.008016032    0    0    0
[6,] 0.989980 0.010020040    0    0    0

tail(combsOne)
                 [,1]      [,2]      [,3]      [,4]      [,5]
[22849595,] 0.2024048 0.2004008 0.2004008 0.2004008 0.1963928
[22849596,] 0.2064128 0.1983968 0.1983968 0.1983968 0.1983968
[22849597,] 0.2044088 0.2004008 0.1983968 0.1983968 0.1983968
[22849598,] 0.2024048 0.2024048 0.1983968 0.1983968 0.1983968
[22849599,] 0.2024048 0.2004008 0.2004008 0.1983968 0.1983968
[22849600,] 0.2004008 0.2004008 0.2004008 0.2004008 0.1983968
all(rowSums(combsOne) == 1)
[1] FALSE

all((rowSums(combsOne) - 1) < .Machine$double.eps)
[1] TRUE
row(combsOne)
[1] 22849600