2

You have two data frames:

df <- data.frame(A = c(1,1,2,2,3,3), B = c('cat','dog','cat','dog','cat','dog'), C = c(100,200,300,400,500,600)) 
df2 <- data.frame(A = c(1,1,1,1,2,2,2,2,3,3,3,3), B = c('cat','dog','cat','dog','cat','dog')) 

Output df1:

 A   B   C
 1 cat 100
 1 dog 200
 2 cat 300
 2 dog 400
 3 cat 500
 3 dog 600

Output df2:

A   B
1 cat
1 dog
1 cat
1 dog
2 cat
2 dog
2 cat
2 dog
3 cat
3 dog
3 cat
3 dog

I know how to match single values such that when 'A' values match on df and df2 it will add that value to df2:

df2$match <- df$C[match(df2$A, df$A)]

Output:

A   B match
1 cat   100
1 dog   100
1 cat   100
1 dog   100
2 cat   300
2 dog   300
2 cat   300
2 dog   300
3 cat   500
3 dog   500
3 cat   500
3 dog   500

How do you match multiple values such that the value of 'C' will be matched when 'A' and 'B' are the same across df and df2?

B C
  • 318
  • 3
  • 16

1 Answers1

7

you could use the interaction between A and B to match like this:

df2$match <- df$C[match(interaction(df2$A, df2$B), interaction(df$A, df$B))]
> df2
   A   B match
1  1 cat   100
2  1 dog   200
3  1 cat   100
4  1 dog   200
5  2 cat   300
6  2 dog   400
7  2 cat   300
8  2 dog   400
9  3 cat   500
10 3 dog   600
11 3 cat   500
12 3 dog   600
Nate
  • 10,361
  • 3
  • 33
  • 40