#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), которую обычно плохо перезаписывать.