2017-06-21 8 views
0

現在、複数のテーブルをマージする必要があります。たとえば、私はtbl_1、tbl_2、およびtbl_3を持っています。結果の表として最終結果に到達したい。いくつかの余分なステップを取るためにR 1つの識別子と同じ名前の他の列のテーブルを結合する

私は(トランスフォームを使用することができます...試みは、「ID」により、3つのテーブルをマージしますが、列名がDeb_counts.x、Deb_counts.yに変わります持って
tbl_1: 
ID trx_1 Cre_counts Deb_counts 
1 10  9  8 
2 5   6  5 
3 10  4  3 

tbl_2: 
ID trx_2 Unk_counts Deb_counts 
1 10  1  2 
2 5  6  5 
3 10  3  7 

tbl_3: 
ID trx_3 Unk_counts Ckc_counts 
1 3  4  4 
2 2  4  3 
3 8  7  6 

result: 
ID trx_1 tx_2 trx_3 Cre_counts Deb_counts Unk_counts Ckc_counts 
1 10  10  3   9  10  5   4 
2 5  5  2   6  10  10   3 
3 10  10  8   4  10  10   6 

)、rowSums()それを機能させる。しかし、私はそれを行うより簡単な方法があるのだろうか?ありがとうございました! 2つのテーブルでの作業、

l_tbl <- mget(ls(pattern="^tbl")) 

は、その後、あなたがリストを行く:

は、まず、あなたがリストにあなたのテーブルを配置する必要があります。ここではたぶん最もエレガントではなく

+0

をあなただけマージしたくない、あなたはいくつかの値をマージし、他の値を追加するには、少なくとも2で続行する必要がありますセントeps – Cath

+0

はい、わかりました。現在、私が取っているステップは2つ以上のステップです。私はすべてのテーブルを最初にマージして、次に追加するすべての列を追加するためにrowSums()を使用します。その後、古い列を削除します。簡単な方法を知っているのではないでしょうか?たぶん2ステップ。 – VeraShao

+0

こんにちは、このリンクがほぼ同じ質問に役立つことを願っています。 https://stackoverflow.com/questions/16018863/combine-data-frames-summing-up-values-of-identical-columns-in-r – Wen

答えて

2

は方法です時間、Reduceのおかげで、最初のマージ、その後、共通の列を追加:

Reduce(function(x, y) { 
      col_com <- setdiff(intersect(names(x), names(y)), "ID") 
      if(length(col_com)) { 
       x[, col_com] <- x[, col_com] + y[, col_com] 
       y <- y[, !(names(y) %in% col_com)] # you only keep the "not common" columns in the second table 
      } 
       return(merge(x, y, by="ID")) 
     }, l_tbl) 

    ID trx_1 Cre_counts trx_3 Ckc_counts trx_2 Deb_counts Unk_counts 
1 1 10   9  3   4 10   10   5 
2 2  5   6  2   3  5   10   10 
3 3 10   4  8   6 10   10   10 
+0

x [、col_com] + y [、col_com]:バイナリ演算子の非数値引数。理由は不明です。最初のステップは良いです。私は言及することを忘れます。 2つのテーブルのそれぞれが同じカラム名を持つわけではないので、col_comはcharacter(0)になることがあります。それが問題の原因になるのでしょうか? – VeraShao

+0

@VeraShao col_comの長さが少なくとも1であるかどうかをチェックするので問題はありません。あなたの共通のcolがすべて数値でない場合を除いて、なぜエラーが発生するのか分かりません – Cath

関連する問題