Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Merge two data frames with all combinations

I got a complicated problem: I have two data frames which have one combination of no and specification (Color, Part) each for 4 different machines. There is a total count of 5 specifications per machine (in reality even more machines and specifications). Here are two sample data frames:

df1 <- data.frame( 
  nr=c("000", "000", "000", "001", "002",
       "002", "003", "004", "004", "004", "005"), 
  Color=c("Red", "Cyan", "Brown", "Blue", "Red",
          "Green", "DeepBlue", "Orange", "Cyan", "Grey", "Magenta"), 
  mach1=c(1, NA, NA, 1, NA, 1, 1, NA, 1, NA, 1),  
  mach2=c(1, NA, NA, 1, NA, 1, 1, 1, NA, NA, 1),  
  mach3=c(NA, 1, NA, 1, 1, NA, 1, NA, NA, 1, 1),  
  mach4=c(NA, NA, 1, 1, NA, 1, 1, NA, NA, 1, 1))

df2 <- data.frame( 
  nr=c("000", "000", "001", "002", "002",
       "003", "003", "004", "005", "005"), 
  Part=c("Car", "Tree", "Flag", "Tree", "Road",
         "Road", "House", "Plane", "House", "Car"), 
  mach1=c(NA, 1, 1, NA, 1, NA, 1, 1, NA, 1),  
  mach2=c(1, NA, 1, NA, 1, NA, 1, 1, 1, NA),  
  mach3=c(NA, 1, 1, 1, NA, 1, NA, 1, 1, NA),  
  mach4=c(NA, 1, 1, 1, NA, 1, NA, 1, 1, NA))

So I have these outputs:

> df1
    nr    Color mach1 mach2 mach3 mach4
1  000      Red     1     1    NA    NA
2  000     Cyan    NA    NA     1    NA
3  000    Brown    NA    NA    NA     1
4  001     Blue     1     1     1     1
5  002      Red    NA    NA     1    NA
6  002    Green     1     1    NA     1
7  003 DeepBlue     1     1     1     1
8  004   Orange    NA     1    NA    NA
9  004     Cyan     1    NA    NA    NA
10 004     Grey    NA    NA     1     1
11 005  Magenta     1     1     1     1
> df2
    nr  Part mach1 mach2 mach3 mach4
1  000   Car    NA     1    NA    NA
2  000  Tree     1    NA     1     1
3  001  Flag     1     1     1     1
4  002  Tree    NA    NA     1     1
5  002  Road     1     1    NA    NA
6  003  Road    NA    NA     1     1
7  003 House     1     1    NA    NA
8  004 Plane     1     1     1     1
9  005 House    NA     1     1     1
10 005   Car     1    NA    NA    NA

Now I would like to combine those two data frames into one new data frame df3 that shows all combinations of Color and Part for the specific machines like this:

> df3
    nr    Color  Part mach1 mach2 mach3 mach4
1  000      Red  Tree     1    NA    NA    NA
2  000      Red   Car    NA     1    NA    NA
3  000     Cyan  Tree    NA    NA     1    NA
4  000    Brown  Tree    NA    NA    NA     1
5  001     Blue  Flag     1     1     1     1
6  002    Green  Road     1     1    NA    NA
7  002      Red  Tree    NA    NA     1    NA
8  002    Green  Tree    NA    NA    NA     1
9  003 Deepblue House     1     1    NA    NA
10 003 Deepblue  Road    NA    NA     1     1
11 004     Cyan Plane     1    NA    NA    NA
12 004   Orange Plane    NA     1    NA    NA
13 004     Grey Plane    NA    NA     1     1
14 005  Magenta   Car     1    NA    NA    NA
15 005  Magenta House    NA     1     1     1
> 

Any suggestions?

like image 474
Juppes Avatar asked Jun 17 '16 11:06

Juppes


1 Answers

You can first reshape the two data frames (using melt from reshape2), then merge them (using full_join from dplyr) and reshape that back into the original format:

library(dplyr)
library(reshape2)

df1.b <- melt(df1)
df2.b <- melt(df2)

df3 <- full_join(df1.b, df2.b)

df3 <- na.omit(df3)

df3.b <- dcast(df3, nr + Color + Part ~ variable)

    nr    Color  Part mach1 mach2 mach3 mach4
1  000    Brown  Tree    NA    NA    NA     1
2  000     Cyan  Tree    NA    NA     1    NA
3  000      Red   Car    NA     1    NA    NA
4  000      Red  Tree     1    NA    NA    NA
5  001     Blue  Flag     1     1     1     1
6  002    Green  Road     1     1    NA    NA
7  002    Green  Tree    NA    NA    NA     1
8  002      Red  Tree    NA    NA     1    NA
9  003 DeepBlue House     1     1    NA    NA
10 003 DeepBlue  Road    NA    NA     1     1
11 004     Cyan Plane     1    NA    NA    NA
12 004     Grey Plane    NA    NA     1     1
13 004   Orange Plane    NA     1    NA    NA
14 005  Magenta   Car     1    NA    NA    NA
15 005  Magenta House    NA     1     1     1
like image 193
erc Avatar answered Oct 04 '22 22:10

erc