0

私は行列を持っています (しかし、例のために単純化してベクトルにします)。

I want to loop over all pairs of the list. So if the list is length n (or the matrix has n columns), the resulting list has to be (n choose 2) items long.

Suppose n = 6 for the example, but in reality is 36.

Basically, I want a loop like this:

list=1:6

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

Here is what I want:

Note the below loop does NOT work since there is no i index, and there appears to be no linear combination of j and k that fits the index. Is there a nonlinear one? Or is there a better way to program this?

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

Giving the output:

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

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

etc.

4

1 に答える 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

ここでのポイントは、ある種のループで自分で組み合わせを作成するよりも、組み合わせを計算してそれらに取り組む方が良いということだと思います。

于 2013-09-15T06:25:22.630 に答える