2016-06-29 17 views
-2

Ich habe zwei Datentabellen, dat und dat2. Es gibt ein paar Spalten, die in beiden Tabellen erscheinen, obwohl die Werte nicht notwendigerweise in jedem der gleichen sind.Zusammenführen von zwei Datentabellen, aber doppelte Spalten vermeiden

Wenn ich die beiden Tabellen mit dat[dat2] zusammenführen, funktioniert alles wie erwartet, außer dass ich einige doppelte Spaltennamen habe. Zum Beispiel erscheint in beiden Tabellen eine Spalte mit dem Namen Status, und bei der Zusammenführung erscheint die Spalte dat2 als i.Status. Anstatt diese Spalten umzubenennen, möchte ich sie einfach aus der Tabelle löschen. Was ist der einfachste Weg, dies zu tun?

+1

Sie können sie nach der Zusammenführung fallen, oder Sie können während der Zusammenführung mit der Teilmenge. – lmo

+2

Der einfachste Weg besteht darin, Spalten zur Verfügung zu stellen, die von der Verknüpfung zum 'j'-Argument bleiben sollen. – jangorecki

+0

Ich versuche zu vermeiden, manuell alle Spaltennamen einzugeben. Ich kann Spalten löschen, die mit 'i. nach der Zusammenführung beginnen, aber das ist ein Hack – Jeff

Antwort

1

Im Folgenden finden Sie einen Code zur Veranschaulichung der Methoden für die beiden Szenarien, die ich erwähnt habe, auch wenn es möglicherweise etwas schickere (effizientere) Methoden gibt.

Beide Methoden passen sich dynamisch der Variablenüberlappung an, sodass Sie sich keine Gedanken über die manuelle Eingabe der Namen machen müssen.

# get some data 
set.seed(1234) 
dt <- data.table(id=1:10, a=letters[1:10], b=rnorm(10), d=rnorm(10)) 
dt2 <- data.table(id=1:10, a=letters[5:14], c=rnorm(10), d=rnorm(10)) 

Hier ist die Daten ohne Abwurf:

dt[dt2, on="id"] 

    id a   b   d i.a   c  i.d 
1: 1 a -1.2070657 -0.47719270 e 0.1340882 1.1022975 
2: 2 b 0.2774292 -0.99838644 f -0.4906859 -0.4755931 
3: 3 c 1.0844412 -0.77625389 g -0.4405479 -0.7094400 
4: 4 d -2.3456977 0.06445882 h 0.4595894 -0.5012581 
5: 5 e 0.4291247 0.95949406 i -0.6937202 -1.6290935 
6: 6 f 0.5060559 -0.11028549 j -1.4482049 -1.1676193 
7: 7 g -0.5747400 -0.51100951 k 0.5747557 -2.1800396 
8: 8 h -0.5466319 -0.91119542 l -1.0236557 -1.3409932 
9: 9 i -0.5644520 -0.83717168 m -0.0151383 -0.2942939 
10: 10 j -0.8900378 2.41583518 n -0.9359486 -0.4658975 

Methode 1: Teilmenge während der Zusammenführung/beitreten die intersect und mget Funktionen.

# assuming your id variable is the first column in both sets: 
dropVars <- intersect(names(dt), names(dt2))[-1] 

dt[dt2[, mget(names(dt2)[-which(names(dt2) %in% dropVars)])], on="id"] 

Methode 2: drop nach merge grep

dt3 <- dt[dt2, on="id"] 
dt3[, grep("^i\\.", names(dt3), value=TRUE) := NULL] 

zurückkehren Beide Methoden

id a   b   d   c 
1: 1 a -1.2070657 -0.47719270 0.1340882 
2: 2 b 0.2774292 -0.99838644 -0.4906859 
3: 3 c 1.0844412 -0.77625389 -0.4405479 
4: 4 d -2.3456977 0.06445882 0.4595894 
5: 5 e 0.4291247 0.95949406 -0.6937202 
6: 6 f 0.5060559 -0.11028549 -1.4482049 
7: 7 g -0.5747400 -0.51100951 0.5747557 
8: 8 h -0.5466319 -0.91119542 -1.0236557 
9: 9 i -0.5644520 -0.83717168 -0.0151383 
10: 10 j -0.8900378 2.41583518 -0.9359486 
+1

oder' keep <- union (Namen (dt), Namen (dt2)); dt [dt2, mget (behalten), on = "id"] ' –

+0

@DavidArenburg Das ist besser, es vermeidet die irritierende' - which() 'Syntax. – lmo