#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)