Объединить два фрейма данных в R и найти общие значения и несовпадающие значения

#r #match #dataframe

#r #сопоставление #фрейм данных

Вопрос:

Я пытаюсь найти функцию для сопоставления двух фреймов данных разной длины только в одном общем столбце и создать другой столбец, в котором указывается, найдено совпадение или нет. Так, например, df1 равен:

 Name Position location
francesca A 75
cristina B 36
  

И df2 равен:

 location Country
75 UK
56 Austria
  

И я хотел бы, чтобы совпадение по «Местоположению» и результату было что-то вроде:

 Name Position Location Match
francesca A 75 1
cristina B 36 0
  

Я пробовал с помощью функции match или с:

 subset(df1, location %in% df2)
  

Но это не работает.

Не могли бы вы, пожалуйста, помочь мне понять, как это сделать?

Ответ №1:

Попробуйте:

 df1$match <- match(df1$location, df2$location, nomatch=0)
  

Это добавит столбец в df1, указывающий, какая строка в df2 соответствует ему (учитывая только указанное вами местоположение). Если совпадений нет, будет возвращен ноль, так что вы получите:

 > df1
       Name Position location match 
1 francesca        A       75     1
2  cristina        B       36     0
  

Одно предостережение: если во второй таблице есть несколько совпадений, вам следует использовать другой подход, поскольку этот метод возвращает только первое совпадение. Я предполагаю, что они уникальны из-за того, как вы задали свой вопрос, так что это не должно быть проблемой.

Комментарии:

1. Джейсон Би, БОЛЬШОЕ ТЕБЕ спасибо. Таким образом, я мог бы получить список записей, совпадающих в обоих dfs (если совпадение> 0), а также список записей, которые присутствуют только в df1 (совпадение == 0). Просто еще один вопрос: знаете ли вы, есть ли простой способ также иметь список записей, которые находятся в df2, которых нет в df1? Спасибо

2. Привет @user971102 — рад, что это сработало для вас (если ответ решил вашу проблему, пожалуйста, примите его, чтобы другие знали). Чтобы получить записи из df2, которых нет в df1, попробуйте: df2[который(is.na (совпадение(df2$location, df1 $location))),] Или, более интуитивно, df2[-который(df2$location %в% df1$location),]

3. Извините, Джейсон Б., только одно последнее уточнение… Поскольку вы сказали, что этот метод не будет работать, если значения не уникальны, у меня был дополнительный шаг в начале, чтобы убедиться, что есть только одна запись для ‘location’, выполнив: df1_unique<-subset(df1, !дублируется (местоположение)), как для df1, так и для df2. Но разве это не должно означать, что для столбца ‘match’ должно быть только 0 или 1 значение? Но мои значения для «совпадения» не только равны 1 или 0…

4. @user971102-не беспокойтесь. df1$match выдает строку, df2 которая соответствует location df1 . Если вам нужны только нули и единицы, вы можете добавить шаг: df1$match<-ifelse(df1$match>0,1,0) или, возможно, было бы лучше использовать логические: df1$match=as.logical(df1$match)