Search code examples
rmergematchcriteria

Merge two dataframes by two conditions


I want to merge two data frames based on two conditions (Name and Date). If no match found I want it to return as NA.

df1:

Date      Name  Value1   Value2 
2009-03   A     30       456
2009-04   A     33       346
2009-05   A     50       856
2009-03   B     80       44
2009-04   B     34       665
2009-03   C     35       756
2009-04   D     64       66

df2:

Name  Date      ValueX
A     2009-03   34
A     2009-04   466
A     2009-05   55
B     2009-03   65
B     2009-04   568
C     2009-03   56
C     2009-04   676

I want the merge to look something like this:

Date      Name  Value1   Value2 **ValueX**
2009-03   A     30       456    34
2009-04   A     33       346    466
2009-05   A     50       856    55
2009-03   B     80       44     65
2009-04   B     34       665    568
2009-03   C     35       756    56
2009-04   D     64       66     NA

I have tried the following:

df3 <- left_join(df1, df2, by = c("Date" = "Date", "Name" = "Name"), df1$ValueX)
df3 <- df1
df3$ValueX <- ifelse(
  is.na(match(paste(df1$Date, df1$Name), paste(df2$Date, df2$Name))), 
  df2$ValueX
)
df3 = merge(df1, df2, by.x=c("Date", "Name"), by.y=c("Date", "Name"), all.x=TRUE)

Any suggestions on how to solve this?


Solution

  • Try this:

    library(tidyverse)
    df3 <- df1 %>% left_join(df2, by= c("Date","Name"))