IT-Swarm.Net

كيف يمكنني دمج إطارين للبيانات استنادًا إلى عمودين؟

أعلم أنه يمكنني استخدام plyr وأصدقائه في الجمع بين dataframes و merge أيضًا ، لكن حتى الآن لا أعلم كيف يمكنني دمج اثنين من dataframes مع أعمدة متعددة استنادًا إلى عمودين؟

87
Sam

راجع الوثائق على ?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's match

كان الهدف من هذا المثال هو توضيح استخدام incomparables ، لكنه يوضح الدمج باستخدام أعمدة متعددة أيضًا. يمكنك أيضًا تحديد أعمدة منفصلة في كل من x و y باستخدام by.x و by.y.

120
joran

أتمنى أن يساعدك هذا؛

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 يعنيان نفس الشيء.

45
Hyunbong Lee

يمكنك أيضًا استخدام أمر الصلة (dplyr).

فمثلا:

new_dataset <- dataset1 %>% right_join(dataset2, by=c("column1","column2"))
2
Daniela