2017-06-21 2 views
0

Ich habe derzeit mehrere Tabellen müssen zusammenführen. Zum Beispiel habe ich tbl_1, tbl_2 und tbl_3. Und ich möchte das Endergebnis als Ergebnistabelle erreichen.R Merge Tabellen mit einem Bezeichner, und andere Spalten mit demselben Namen summieren sich

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 

Ich habe versucht, drei Tabellen mit „ID“ fusionieren, aber die Spaltennamen Deb_counts.x, Deb_counts.y ändern ... Ich umsetzen können(), rowSums() einigen zusätzlichen Schritt zu wagen damit es funktioniert. Aber ich frage mich, gibt es einen einfacheren Weg, es zu tun? Vielen Dank!

+0

Sie wollen nicht nur fusionieren, möchten Sie einige Werte fusionieren und andere Werte hinzufügen, müssen Sie mindestens 2 fortfahren in st eps – Cath

+0

Ja, das verstehe ich. Derzeit sind die Schritte, die ich unternehme, mehr als zwei Schritte. Ich füge zuerst alle Tabellen zusammen und verwende rowSums(), um alle Spalten hinzuzufügen, die ich hinzufügen möchte. Löschen Sie dann alte Spalten. Frage mich nur, ob du einen einfacheren Weg kennst? vielleicht nur 2 Schritte. – VeraShao

+0

Hallo, hoffe dieser Link hilft, fast die gleiche Frage. https://stackoverflow.com/questions/16018863/combine-data-frames-summing-up-values-of-identical-columns-in-r – Wen

Antwort

2

Vielleicht nicht das eleganteste, aber hier ist ein Weg:

Zuerst müssen Sie Ihre Tabellen in eine Liste setzen:

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

Dann gehen Sie durch die Liste, mit 2 Tischen arbeiten an eine Zeit, dank Reduce zunächst die gemeinsamen Spalten hinzufügen, dann verschmelzen:

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

Ich habe einen Fehler in x [, col_com] + y [, col_com]: Nicht-numerisches Argument zum binären Operator. Nicht sicher der Grund. Der erste Schritt ist gut. Ich vergesse zu erwähnen. Nicht alle zwei Tabellen haben die gleichen Spaltennamen, also ist col_com manchmal ein Zeichen (0). Wird das die Ursache des Problems sein? – VeraShao

+0

@VeraShao das wird kein Problem sein, wie ich überprüfe, ob col_com Länge mindestens eins hat. Ich weiß nicht, warum Sie einen Fehler erhalten, außer wenn Ihre gemeinsamen Spalten nicht alle numerisch sind – Cath

Verwandte Themen