2016-09-20 3 views
1

現在、Rを利用して特定の行列内の各列を比較する際に問題が発生しています。私はすべての列を一度に比較しようとしましたが、テーブルコマンドで真と偽の出力を生成し、見つかった真理値の数を数値に変換し、その値を入射行列。ここでR:読み込みテーブルの値を比較し、別の行列を更新する

For example, I have data in this type of format: 
//Example state matrix - I am attempting to compare c1 with c2, then c1 with c3, then c1 with c4 and so on and so forth 
    c1 c2 c3 c4 
r1 2 6 3 2 
r2 1 1 6 5 
r3 3 1 3 6 

And I am trying to instead put it into this format 
//Example incidence matrix - Which is how many times c1 equaled c2 in the above matrix 
    c1 c2 c3 c4 
c1 3 1 1 1 
c2 1 3 0 0 
c3 1 0 3 0 
c4 1 0 0 3 

は、私がこれまでに出ているコードである、しかし、私は、この特定のエラーを取得しておく -

警告メッセージ:IncidenceMatで [ラット] [R] = IncidenceMat [ラット] [ r] + as.numeric(instances):置換するアイテムの数が置換の長さの倍数ではありません。
rawData = read.table("5-14-2014streamW636PPstate.txt") 
colnames = names(rawData) #the column names in R 
df <- data.frame(rawData) 
rats = ncol(rawData) 
instances = nrow(rawData) 

IncidenceMat = matrix(rep(0, rats), nrow = rats, ncol = rats) 

for(rat in rats) 
    for(r in rats) 
     if(rat == r){rawData[instance][rat] == rawData[instance][r] something like this would work in C++ if I attempted, 
     IncidenceMat[rat][r] = IncidenceMat[rat][r] + as.numeric(instances) 
    } else{ 
    count = df[colnames[rat]] == df[colnames[r]] 
    c = table(count) 
    TotTrue = as.numeric(c[2][1]) 
    IncidenceMat[rat][r] = IncidenceMat[rat][r] + TotTrue #count would go here #this should work like a charm as well 
    } 

ご協力いただけると助かります。私もこれらのリソースのいくつかを見てきましたが、私はまだ困惑しています

I tried thisand this私は最近閉じた他のリソースと一緒に。

答えて

1

これはいかがですか(入射行列は対称であることに注意してください)?

df 
    c1 c2 c3 c4 
r1 2 6 3 2 
r2 1 1 6 5 
r3 3 1 3 6 

incidence <- matrix(rep(0, ncol(df)*ncol(df)), nrow=ncol(df)) 
diag(incidence) <- nrow(df) 
for (i in 1:(ncol(df)-1)) { 
    for (j in (i+1):ncol(df)) { 
    incidence[i,j] = incidence[j,i] = sum(df[,i] == df[,j]) 
    } 
} 

incidence 
    [,1] [,2] [,3] [,4] 
[1,] 3 1 1 1 
[2,] 1 3 0 0 
[3,] 1 0 3 0 
[4,] 1 0 0 3 
+0

これは素晴らしい機能でした。 @sandipanあなたの思考過程がここにあったことを説明してもらえますか? – zackymo21

+0

sure @ zackymo21。最初に、入射行列の次元はn×nであり、n =元の行列の#列(2列ごとに比較する必要があるため)であることに注意してください。また、入射行列が対称であることにも注意してください。すべての対角要素はnと等しくなります(それ自体で各列に正確にn個の要素が似ているため)。最後に、sum(df [、i] == df [、j])で行うことができる列ベクトルiとjの間の類似度を計算する必要があります。 –

+0

私はそれを今得ます!明確化のために非常にありがとう!私はちょうどもう一つの質問がある、あなたは私の質問をupvoting気ですか? @sandipan – zackymo21

関連する問題