2014-06-27 11 views
5

Ich habe zwei Datenrahmen. Zum BeispielR fusionieren ohne doppelte Spalten

require('xlsx') 
csvData <- read.csv("myData.csv") 
xlsData <- read.xlsx("myData.xlsx") 

CSVData sieht wie folgt aus:

Period CPI  VIX 
1  0.029 31.740 
2  0.039 32.840 
3  0.028 34.720 
4  0.011 43.740 
5  -0.003 35.310 
6  0.013 26.090 
7  0.032 28.420 
8  0.022 45.080 

xlsData wie folgt aussieht:

Period CPI  DJIA 
1  0.029 12176 
2  0.039 10646 
3  0.028 11407 
4  0.011 9563 
5  -0.003 10708 
6  0.013 10776 
7  0.032 9384 
8  0.022 7774 

Wenn ich diese Daten zusammenführen, wird die CPI-Daten dupliziert und ein Suffix wird gesetzt auf der Kopfzeile, was problematisch ist (ich habe viel mehr Spalten in meinen echten DFs).

mergedData <- merge(xlsData, csvData, by = "Period") 

mergedData:

Period CPI.x VIX  CPI.y DJIA 
1  0.029 31.740 0.029 12176 
2  0.039 32.840 0.039 10646 
3  0.028 34.720 0.028 11407 
4  0.011 43.740 0.011 9563 
5  -0.003 35.310 -0.003 10708 
6  0.013 26.090 0.013 10776 
7  0.032 28.420 0.032 9384 
8  0.022 45.080 0.022 7774 

Ich mag den Datenrahmen fusionieren, ohne Spalten mit demselben Namen duplizieren. Zum Beispiel möchte ich diese Art der Ausgabe:

Period CPI  VIX  DJIA 
1  0.029 31.740 12176 
2  0.039 32.840 10646 
3  0.028 34.720 11407 
4  0.011 43.740 9563 
5  -0.003 35.310 10708 
6  0.013 26.090 10776 
7  0.032 28.420 9384 
8  0.022 45.080 7774 

Ich will nicht zusätzlich zu verwenden haben ‚durch‘ Argumente oder Löschen von Spalten aus einer der df ist, weil es zu viele Spalten sind, die dupliziert werden in beiden dfs. Ich suche nur nach einer dynamischen Möglichkeit, diese doppelten Spalten während des Merge-Prozesses zu löschen.

Danke!

Antwort

7

Sie können das Argument by überspringen, wenn die gemeinsamen Spalten gleich benannt sind.

Von ?merge:

standardmäßig die Datenrahmen auf der Spalt mit Namen verschmolzen sind sie beide, aber gesonderte Spezifikationen der Spalten können durch by.x und by.y gegeben werden.

dass Unter Berücksichtigung sollte die folgende Arbeit (wie es bei Ihren Testdaten haben):

merge(csvData, xlsData) 
# Period CPI VIX DJIA 
# 1  1 0.029 31.74 12176 
# 2  2 0.039 32.84 10646 
# 3  3 0.028 34.72 11407 
# 4  4 0.011 43.74 9563 
# 5  5 -0.003 35.31 10708 
# 6  6 0.013 26.09 10776 
# 7  7 0.032 28.42 9384 
# 8  8 0.022 45.08 7774 
+1

Danke. Ich wusste nicht, "By" war optional. Was ist, wenn meine df's unterschiedlich lang sind? Angenommen, csvData hat nur 7 Zeilen. Ich möchte alle Daten von xlsData behalten. Dann cbind die csvData (NULL ist in Ordnung für Zeile 8 entsprechend csvData). –

+2

@Clark, benutze 'all = TRUE' vielleicht? Beispiel: 'merge (csvdata [1: 7,], xlsdata, all = TRUE)' – A5C1D2H2I1M1N2O1R2T1

+0

Dies funktioniert nicht mit SparkR. –

Verwandte Themen