Объедините два фрейма данных в 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)

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

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


person user971102    schedule 03.10.2011    source источник


Ответы (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

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

person Jason B    schedule 03.10.2011
comment
Джейсон Б, СПАСИБО большое. Таким образом я мог бы получить список записей, совпадающих в обеих dfs (если match›0), а также список записей, которые присутствуют только в df1 (match==0). Еще один вопрос: знаете ли вы, есть ли простой способ получить список записей, которые находятся в df2, но не в df1? Спасибо - person user971102; 03.10.2011
comment
Привет @ user971102 - рад, что это сработало для вас (если ответ решил вашу проблему, примите его, чтобы другие знали). Чтобы получить записи из df2, которых нет в df1, попробуйте: df2[what(is.na(match(df2$location, df1$location))),] Или, более интуитивно, df2[-what(df2$location % в% df1$местоположение),] - person Jason B; 03.10.2011
comment
Извините, Джейсон Б., только одно последнее уточнение... Поскольку вы сказали, что этот метод не будет работать, если значения не уникальны, у меня был дополнительный шаг в начале, чтобы убедиться, что для «местоположения» существует только одна запись, выполнив: df1_unique‹-subset(df1, !duplicated(location)), как для df1, так и для df2. Но не должно ли это означать, что для столбца «совпадение» должны быть только значения 0 или 1? Но мои значения для «совпадения» не только = 1 или 0... - person user971102; 04.10.2011
comment
@ user971102-не беспокойтесь. df1$match дает строку в df2, которая соответствует location в df1. Если вам нужны только нули и единицы, вы можете добавить шаг: df1$match<-ifelse(df1$match>0,1,0) или, возможно, будет лучше использовать логику: df1$match=as.logical(df1$match) - person Jason B; 04.10.2011