2016-11-22 6 views
0

私は4000列のデータを2000行持っています。私がしようとしているのは、各行を残りの行と比較して、それぞれが異なる列/合計列に関してどれほど似ているかを確認することです。次のように私はこれまでのところで何をしたかR結合ループのパフォーマンス

:それで2つの問題がある

for (i in 1:nrow(data)) 
{ 
    for (j in (i+1):nrow(data)) 
    { 
     mycount[[i,j]] = length(which(data[i,] != data[j,])) 
    } 
} 

、jはI + 1から開始されません(おそらく基本的な間違いである) 主な問題しかし、それは時間を消費する、それは年齢がかかります...

誰かが同じ結果を達成するより適切な方法を提案してください結果は、他の行との各行の類似性の割合ですか?ここで

は、データと私が達成したいの例です: screenshot of the image

のような出力が何かする必要があります:あなたのコード内の一つの問題は、mycount[[i]]の値がで更新されていることである

mycount[1,2] = 2 (S# and var3 columns are different) 
mycount[1,3] = 2 (S# and var1 columns are different) 
mycount[1,4] = 2 (S# and var4 columns are different) 
mycount[2,3] = ... 
mycount[2,4] = ... 
mycount[3,4] = 3 (S#, var1 and var 4 are different) 
+0

(ただしおそらくまだ遅すぎる)ダブルループよりも高速になり、次のコードを、試すことができます? –

+2

i + 1から始まっていないのは 'i + 1:nrow(data)'のためであり、これを 'i + 1:nrow(data)'と読み替えて、paranthesesを追加する必要があります: '(i + 1):nrow (データ) 'を生成する。 –

+1

[再現可能な例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)を追加してください。 – fridaymeetssunday

答えて

0

jループの各繰り返し(前の値が上書きされる)になるので、mycount[[i]]length(which(data[i,] != data[nrow(data),]))に等しくなります。もう1つの問題は、は数字i+1, i+2, ... nrow(data)ではなく、i + (1:nrow(data))を生成するということです。だからあなたが望むのは(i + 1):nrow(data)またはseq(i + 1, nrow(data))です。

あなたは、あなたはそれが同じだかどうかを確認するために、その下に直接行に各列を比較したい

rows <- lapply(seq(nrow(data)), function(i) data[i, ]) 
outer(X = rows, Y = rows, FUN = Vectorize(function(x, y) sum(x == y)))