2016-07-25 7 views
-3

Es gibt zwei Dateien und die Daten wie folgt aussieht:
file1One-One kommen in R

Col1 Col2 
**A**  10 
**B**  20 
**C**  30 
**D**  40 

file2:

Col1 col2 
**A** XYZ 
**B** PQR 
**B** QES 
**C** UIY 
**D** UUI 
**D** HUI 
**E** BIG 

ich diese beiden Dateien auf col1 1 anschließen möchten, aber ich möchte nur die Einträge, bei denen wir nur Eins-zu-Eins-Zuordnung haben. Der Ausgang shoul wie folgt aussehen:
Datei A (wo wir Spiel haben)
A 10 XYZ
C 30 uiy

Datei B (Wo wir keinen 00.59 Karte gefunden)

col1 col2
B 20
D 40

AS B und D haben mehrere Einträge in der Datei 2, so wan ich nicht t diese Datensätze in meinem Join-Ergebnis.

+0

Verwandte merge Beitrag mit: [? Wie (merge) Datenrahmen (innen, außen, links, rechts) verbinden] (http://stackoverflow.com/questions/1299871) – zx8754

Antwort

2

können wir eine inner_join verwenden nach dem zweiten Datensatz subsetting

library(dplyr) 
df2 %>% 
    group_by(Col1) %>% 
    filter(n()==1) %>% 
    inner_join(., df1, by = "Col1") 
#  Col1 col2 Col2 
# <chr> <chr> <int> 
#1  A XYZ 10 
#2  C UIY 30 

oder doppelte Elemente zu vermeiden, wie @ zx8754

vorgeschlagen
res <- df2 %>% 
     inner_join(., df1, by = "Col1") %>% 
     group_by(Col1) %>% 
     filter(n()==1) 

Um die Zeilen zu erhalten, die nicht in den 'res' sind , tun ein anti_join

res %>% 
    select(Col1, Col2) %>% 
    anti_join(df1, .) 
# Col1 Col2 
#1 B 20 
#2 D 40 

Oder data.table

library(data.table) 
na.omit(setDT(df2)[df1, Col2 := Col2[.N==1],on = "Col1", by = .EACHI]) 
# Col1 col2 Col2 
#1: A XYZ 10 
#2: C UIY 30 
+1

I würde nach dem Join Filter hinzufügen, falls df1 doppelte Werte hat. – zx8754

+0

Ich bekomme die, die ich gefunden habe eine Übereinstimmung, ich möchte diejenigen, die keine Übereinstimmung in DF2 haben getrennt werden, so wird es zwei Datei eins: wo gibt es eine Übereinstimmung und zweitens: wo wir keine haben Spiel. Ich werde Ihren Ansatz auf meinem Testdatensatz testen. Vielen Dank !!! –

+0

@HimanshuChawla dies basiert auf Ihrem Beispiel und es funktioniert dafür. – akrun