2016-05-24 23 views
1

マージI、列によって、これらの3つのデータ・フレーム(すなわち、9つの組み合わせ)のすべての可能なペアの組合せをマージしたい複数のデータフレームのすべての可能な組み合わせを

同じ3行毎ではなく、中を含む
frame1 = data.frame(a=c(1,2,3), b=c(1,2,3), c=c(1,2,3)) 
frame2 = data.frame(a=c(2,1,3), b=c(2,1,3), c=c(2,1,3)) 
frame3 = data.frame(a=c(3,2,1), b=c(3,2,1), c=c(3,2,1)) 

同じ順番なので、2つのファイルの列aとbの値のペアがマージされて一致することも併合したいと思います。例:

a b c 
1 1 1 
2 2 2 
3 3 3 

+

a b c 
2 2 2 
1 1 1 
3 3 3 

=

a.x b.x c.x a.y b.y c.y 
1 1 1 1 1 1 
2 2 2 2 2 2 
3 3 3 3 3 3 

Iは、各マージされたファイルの列CXとCY存在の値の各対の間の差を得ることがたかっで絶対値を計算し、これらすべての差を合計することで、対応するセルの空の行列3x3に追加したい「スコア」(もちろん、これはこの例ではゼロ)を得ます(つまりスコア図2は、セル内に位置しなければならないフレーム対フレーム1、[2,1]、など):また、

Error in fix.by(by.x, x) : 'by' must specify uniquely valid columns 

:私はループを実行するとき

nframes = 3 
frames = c(frame1,frame2,frame3) 

matrix = matrix(, nrow = nframes, ncol = nframes) 
matrix_scores = data.frame(matrix) 

for (i in frames){ 
    for (j in frames) 
    { 
    x = merge(i, j, by=c("a","b")) 
    score = sum(abs(x$c.x - x$c.y)) 
    matrix_scores[j,i] <- score 
    } 
} 

しかし、私は、次のメッセージを取得します私は、ループの最初の反復のために、[1,1]ライン

matrix_scores[j,i] <- score 

は、あまりにも、エラーになりますが、私は、私はスコアがセルに格納したいことを表現する方法がわからないということを理解します(フレーム1対フレーム1)。

 f1 f2 f3 
frame1 0 0 0 
frame2 0 0 0 
frame3 0 0 0 
+0

あなたのコードは、いくつかの場所で問題がある

結果の行列はすべてゼロを含む3×3行列でなければなりません。データフレームをリストに格納しておらず、代わりに 'frames = c(frame1、frame2、..)'を使用しました。連結機能が正しくない 'list(frame1、frame2、...)'が良いかもしれません。ループでは、同じデータフレームが時にはそれ自身とマージされます。 –

+0

それを変更した後、エラーは「seq_len(nrows)[i]でエラーになりました:無効な添字タイプ 'list'' – Michael

+0

それはあなたの最終的な解決策であるとは言いませんでした。私はあなたのアプローチで多くの人の最初のエラーを示しています。 'c()'を使いたい場合は、先に進んで楽しい時間を過ごしてください。 –

答えて

0

あなたが行うことができます:

# Put all frames in a list 
d <- list(frame1, frame2, frame3) 
# get all merge-combinations 
gr <- expand.grid(1:length(d), 1:length(d)) 

# function to merge and get the sum diff: 
foo <- function(i, x, gr){ 
    tmp <- merge(x[[gr[i, 1]]], x[[gr[i, 2]]], by=c("a", "b")) 
    sum(abs(tmp$c.x - tmp$c.y)) 
} 

# result matrix 
matrix(sapply(1:nrow(gr), foo, d, gr), length(d), length(d), byrow = T) 
     [,1] [,2] [,3] 
[1,] 0 0 0 
[2,] 0 0 0 
[3,] 0 0 0 

# The scores are set as followed: 
matrix(apply(gr, 1, paste, collapse="_"), 3, 3, byrow = T) 
     [,1] [,2] [,3] 
[1,] "1_1" "2_1" "3_1" 
[2,] "1_2" "2_2" "3_2" 
[3,] "1_3" "2_3" "3_3" 


# alternative using apply: 

# function to merge and get the sum diff: 
foo <- function(y, x){ 
    tmp <- merge(x[[ y[1] ]], x[[ y[2] ]], by=c("a", "b")) 
    sum(abs(tmp$c.x - tmp$c.y)) 
} 
# result matrix 
matrix(apply(gr, 1, foo, d), length(d), length(d), byrow = T) 
+0

ジンボウありがとうございました、私の望みどおりですが、 'gr < - expand.grid(1:length(x)、1:3)'の後にエラーが表示されます。 ':expand.grid(1:length (x)、1:3):オブジェクト 'x'が見つかりませんでした。 – Michael

+0

@Michael私はそれを修正しました。 'x'を' d'に変更する必要があります。行列を行方向に構築するために 'byrow'引数を含めたことも見てください。それを有用な答えとして受け入れることを検討してください。 – Jimbou

+0

はい、私はそれを受け入れますが、これを関数に追加してください: 'sum(abs(tmp $ r.2.x - tmp $ r.2.y))'、絶対値が必要です。そうでなければ、完璧に動作します、ありがとう! – Michael

関連する問題