Как объединить два кадра данных на основе двух столбцов?

Я знаю, что я могу использовать plyr и его друзей, чтобы объединить dataframes и merge, но пока я не знаю, как объединить два фрейма данных с несколькими столбцами на основе двух столбцов?

Ответ 1

См. документацию на ?merge, которая гласит:

By default the data frames are merged on the columns with names they both have, 
 but separate specifications of the columns can be given by by.x and by.y.

Это означает, что merge будет объединять кадры данных на основе более чем одного столбца. Из заключительного примера, приведенного в документации:

x <- data.frame(k1=c(NA,NA,3,4,5), k2=c(1,NA,NA,4,5), data=1:5)
y <- data.frame(k1=c(NA,2,NA,4,5), k2=c(NA,NA,3,4,5), data=1:5)
merge(x, y, by=c("k1","k2")) # NA match

Этот пример предназначен для демонстрации использования incomparables, но он иллюстрирует слияние с использованием нескольких столбцов. Вы также можете указать отдельные столбцы в каждом из x и y с помощью by.x и by.y.

Ответ 2

Надеюсь, что это поможет;

df1 = data.frame(CustomerId=c(1:10),
             Hobby = c(rep("sing", 4), rep("pingpong", 3), rep("hiking", 3)),
             Product=c(rep("Toaster",3),rep("Phone", 2), rep("Radio",3), rep("Stereo", 2)))

df2 = data.frame(CustomerId=c(2,4,6, 8, 10),State=c(rep("Alabama",2),rep("Ohio",1),   rep("Cal", 2)),
             like=c("sing", 'hiking', "pingpong", 'hiking', "sing"))

df3 = merge(df1, df2, by.x=c("CustomerId", "Hobby"), by.y=c("CustomerId", "like"))

Предполагая, что df1$Hobby и df2$like означают одно и то же.