我有一个矩阵(但为了示例的目的,我将简化为矢量)。
我想遍历所有列表对。因此,如果列表长度为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
等
答案 0 :(得分: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
我认为这里的内容是,最好是计算你的组合,然后对它们进行处理,而不是自己在某种循环中创建组合。