Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to match 1 column to 2 columns?

Tags:

r

I'm trying to match numbers from one column to numbers in two other columns. I can do this just fine when matching to only a single column, but have problems extending to two columns. Here is what I am doing:

I have 2 dataframes, df1:

number  value
1   
2   
3   
4   
5   

and df2:

number_a    number_b    value
3                       3
            1           5  
5                       1 
            4           2
            2           4

What I want to do is match column "number" from df1 to EITHER "number_a" or number_b" in df2, then insert "value" from df2 into "value" of df1, to give the result df1 as:

number  value
1           5
2           4
3           3   
4           2
5           1 

My approach is to use

df1$value <- df2$value[match(df1$number, df2$number_a)]

or

df1$value <- df2$value[match(df1$number, df2$number_b)]

which yields, respectively, for df1

number  value
1           NA
2           NA
3           3
4           NA
5           1

and

number  value
1           5
2           4
3           NA
4           2
5           NA

However, I can't seem to fill in all of the "value" column in df1 using this approach. How can I match "number" to "number_a" and "number_b" in one fell swoop. I tried

df1$value <- df2$value[match(df1$number, df2$number_a:number_b)]

but that didn't work.

Thanks!

like image 488
Thomas Avatar asked Nov 29 '25 05:11

Thomas


2 Answers

Easier solution:

df2$number <- ifelse(is.na(df2$number_a), df2$number_b, df2$number_a)

If you're not familiar with ifelse, it works with vectors in the form:

ifelse(Condition, ValueIfTrue, ValueIfFalse)
like image 184
Señor O Avatar answered Nov 30 '25 20:11

Señor O


I am a newbie to R (coming from several years with C). Was trying out the suggestions and I thought I would paste what I came up with:

// Assuming either 'number_a' or 'number_b' is valid
// Combine into new column 'number' and delete them original columns

df2 <- transform(df2, number = ifelse(is.na(df2$number_a), df2$number_b, 
       df2$number_a))[-c(1:2)]

// Combine the two data frames by the column 'number'
df <- merge(df1, df2, by = "number")
  number value
       1     5
       2     4
       3     3
       4     2
       5     1
like image 44
tban Avatar answered Nov 30 '25 21:11

tban



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!