множественное сопоставление между двумя фреймами данных

#r #matching

#r #сопоставление

Вопрос:

У меня есть два фрейма данных. Один содержит вхождения видов в округах, а второй имеет атрибуты для каждого округа. Вот пример набора игрушечных данных.

 species = c(rep("sp1",4),rep("sp2",3),rep("sp3",2)) ## species name
county = c("A","B","C","D","A","B","c","A","B") ## county occurrence
df=data.frame(species,county) 
County=data.frame(county=c("A","B","C","D"),attribute=c(1:4)) ## county data frame
 

Я хочу создать набор данных, который содержит для каждой строки df атрибуты уровня округа, связанные с видом. Это достаточно легко сделать с помощью match .

Тем не менее, я хочу выяснить для каждого округа виды, которые связаны с этим округом из df. В этом случае match() возвращает только первое совпадение. Я хочу вернуть все совпадения. Например, для округа A будет строка для sp1, sp2 и sp3.

У меня есть способ сделать это с помощью цикла, который устанавливает подмножества для каждого отдельного вида, но он медленный, и мне интересно, есть ли более быстрый способ. Спасибо за любую информацию.

Ответ №1:

функция слияния должна делать то, что вам нужно; вы можете думать об этом как об операции объединения из SQL или других языков запросов к базе данных.

 merge(df, County, by='county')
 

аргумент by может принимать несколько переменных с помощью функции ‘c’, и если столбцы для объединения различаются между фреймами данных, вы можете использовать by.x и by.y.

кроме того, символ ‘df’ уже используется стандартной функцией (функцией плотности для распределения F), которую обычно плохо перезаписывать.