2016-07-25 4 views
-3

Есть два файла и данные выглядит следующим образом:
file1One-One присоединиться к 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 

Я хочу присоединиться к этим два файла на col1 1, но я хочу только те записи, в которых мы имеем только одно к одному. Выход Шоул выглядеть следующим образом:
файл A (где мы имеем матч)
A 10 XYZ
C 30 Uiy

файл B (где мы не нашли один на один карту а)

col1 col2
B 20
D 40

AS B и D имеют несколько записей в файле 2, так что я не тусклый t эти записи в моем результате соединения.

+0

Связанные слияния пост: [? Как присоединиться (объединить) кадры данных (внутренний, внешний, левый, правый)] (http://stackoverflow.com/questions/1299871) – zx8754

ответ

2

Мы можем использовать inner_join после Подменю второго набора данных

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 

Или, чтобы избежать повторяющихся элементов, а @ zx8754 предложил

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

Чтобы получить строки, которые не в «Рез» , сделать anti_join

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

Или с помощью 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 добавит фильтр после объединения, если df1 имеет дублированные значения. – zx8754

+0

Я получаю тот, который нашел совпадение, хочу отделить те, которые не имеют соответствия в df2, поэтому будет два файла: где есть совпадение и второе: где у нас нет совпадение. Я проверю ваш подход на моем тестовом наборе данных. Большое спасибо! –

+0

@HimanshuChawla это основано на вашем примере и работает для этого. – akrun

Смежные вопросы