Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Left join with multiple conditions in R

Tags:

r

dplyr

I'm trying to replace ids for their respective values. The problem is that each id has a different value according to the previous column type, like this:

>df
  type id 
1  q1   1
2  q1   2
3  q2   1
4  q2   3
5  q3   1
6  q3   2

Here's the type ids with its value:

>q1
  id value
1 1  yes
2 2  no

>q2 
   id value
1  1  one hour
2  2  two hours
3  3  more than two hours

>q3
  id value
1 1  blue
2 2  yellow

I've tried something like this:

df <- left_join(subset(df, type %in% c("q1"), q1, by = "id"))

But it removes the other values.

I' like to know how to do a one liner solution (or kind of) because there are more than 20 vectors with types description.

Any ideias on how to do it?

This is the df i'm expecting:

>df
  type id value
1  q1   1 yes
2  q1   2 no
3  q2   1 one hour
4  q2   3 more than two hours
5  q3   1 blue
6  q3   2 yellow
like image 545
Lucca Ramalho Avatar asked Jan 21 '19 16:01

Lucca Ramalho


1 Answers

You can join on more than one variable. The example df you give would actually make a suitable lookup table for this:

value_lookup <- data.frame(
  type = c('q1', 'q1', 'q2', 'q2', 'q3', 'q3'),
  id = c(1, 2, 1, 3, 1, 2),
  value = c('yes', 'no', 'one hour', 'more than two hours', 'blue', 'yellow')
)

Then you just merge on both type and id:

df <- left_join(df, value_lookup, by = c('type', 'id'))  

Usually when I need a lookup table like that I store it in a CSV rather than write it all out in the code, but do whatever suits you.

like image 141
Brian Stamper Avatar answered Oct 11 '22 23:10

Brian Stamper