如何将循环结果存储在列表的组合对中?

问题描述 投票:0回答:1

我有一个矩阵(但为了示例的目的,我将简化为向量)。

我想循环遍历列表的所有对。因此,如果列表长度为n(或矩阵具有n列),则结果列表必须是(n选择2)项长。

假设n = 6作为示例,但实际上是36。

基本上,我想要一个这样的循环:

list=1:6

endlist= vector("list", 15)   # 15 from 6!/((4!)(2!))

这就是我想要的:

注意下面的循环不起作用,因为没有i索引,并且似乎没有适合索引的j和k的线性组合。有非线性的吗?或者有更好的方法来编程吗?

for(j in 1:5){  
    for(k in (j+1):6){
        endlist[[i]]=list[j]*list[k] 
    }
}

给出输出:

endlist=
[[1]]
[1] 2 3 4 5 6 

[[2]]
[1] 6 8 10 12 

等等

r list loops combinatorics
1个回答
2
投票

绝对有更好的方法来编码。我不确定这将如何适用于您的矩阵,但对于您的示例:

combn(list, 2, prod)
#[1]  2  3  4  5  6  6  8 10 12 12 15 18 20 24 30

combn()生成向量的组合,并且可以将函数应用于每个组合(prod)。如果你真的想要输出作为列表,你可以使用split()

split(combn(list, 2, prod), rep(1:(max(list)-1), times =(max(list)-1):1))
# $`1`
# [1] 2 3 4 5 6
# 
# $`2`
# [1]  6  8 10 12
# 
# $`3`
# [1] 12 15 18
# 
# $`4`
# [1] 20 24
# 
# $`5`
# [1] 30

我认为这里的内容是,最好是计算你的组合,然后对它们进行研究,而不是自己在某种循环中创建组合。

© www.soinside.com 2019 - 2024. All rights reserved.