2017-04-20 5 views
0

長さ10のリスト(例: "abc")から一連の非冗長要素ペアの交差を評価しようとしていますが、各要素のために、長さ20を有する2つの整数のベクトルを含み、以下に示すように、(例えば2)以上の一定数以上有している交差点のためのペアインデックスのベクトルを生成する:私は疑問に思ってRのプログラミングでリストのペアワイズ反復の長さが異なるダブルループを使用する代わりに

set.seed(42) 
abc <- replicate(10, list(sample(1:100, 20), sample(1:100, 20)), simplify=F) 

edges <- c() 
for (i in 1:(length(abc)-1)) { 
    for (j in (i+1):length(abc)) { 
    if (length(intersect(abc[[i]][[1]], abc[[j]][[1]])) >= 2 & length(intersect(abc[[i]][[2]], abc[[j]][[2]])) >= 2) { 
     edges <- c(edges, c(i,j)) 
    } 
    } 
} 

同じ結果をより効率的かつ迅速に生成する方法が他にもある場合は、合理的なサイズのリストにループを使用するのは大丈夫ですが、リストが大きくなると予想よりも時間がかかります。私は 'lapply'や他の同様の関数を使用しようとしていましたが、これらの 'lapply'型付き関数を使用することは単一のループでは単純ですが、ループ繰り返し数が異なる2重ループでは良い解決策を思いつくのは難しい。前もって感謝します!

+0

実際には何が必要ですか?交差が必要なことは重要ですか?整数ベクトルは本当に1..100の値を持っていますか?あなたのリストのサイズは? – user31264

答えて

0

あなたは繰り返すことができた全体でインデックスを生成するためにcombsを使用することができます。組み合わせは、すぐに大きな得るので、これは10個の要素(choose(10, 2) = 45個の組み合わせ)のために高速である一方であること、しかし、

set.seed(47) 

abc <- replicate(10, list(sample(1:100, 20), sample(1:100, 20)), simplify=F) 

combs <- combn(length(abc), 2) 

i <- apply(combs, 2, function(x){ 
    length(intersect(abc[[x[1]]][[1]], abc[[x[2]]][[1]])) >= 2 & 
    length(intersect(abc[[x[1]]][[2]], abc[[x[2]]][[2]])) >= 2 
}) 

combs[,i] 
#>  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] 
#> [1,] 1 1 1 1 1 1 1 1 1  2  2  2  2 
#> [2,] 2 3 4 5 6 7 8 9 10  3  4  5  6 
#>  [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] 
#> [1,]  2  2  2  3  3  3  3  3  4  4  4 
#> [2,]  7  8 10  4  6  8  9 10  5  6  7 
#>  [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] 
#> [1,]  4  4  4  5  5  5  5  5  6  6  6 
#> [2,]  8  9 10  6  7  8  9 10  7  8  9 
#>  [,36] [,37] [,38] [,39] [,40] [,41] 
#> [1,]  6  7  7  7  8  9 
#> [2,] 10  8  9 10 10 10 

注意を1万要素の想像を絶するリストのために、choose(10000, 2) = 49,995,000 = 2つのサブ要素の組み合わせをチェックすると、より多くのメモリと時間が必要になります。

関連する問題