create example data:
df <- data.frame(date=c("2017-01-01","2017-01-02", "2017-01-03", "2017-01-04", "2017-01-05"), X1=c("A", "B", "C", "D", "F"), X2=c("B", "A", "D", "F", "C")) df2 <- data.frame(date=c("2017-01-01","2017-01-02", "2017-01-03", "2017-01-04", "2017-01-05"), A=c("3", "4", "2", "1", "5"), B=c("6", "2", "5", "1", "1"), C=c("1", "4", "5", "2", "3"), D=c("67", "67", "63", "61", "62"), F=c("31", "33", "35", "31", "38"))
So, I have two data frames, and I want to match the values โโfrom df2 to df by date and X1 and X2 and create new variables for them. What makes this difficult for me is that the consistent values โโin df2 are in the code names. The end result should look like this:
> result date X1 X2 Var1 Var2 1 2017-01-01 AB 3 6 2 2017-01-02 BA 2 4 3 2017-01-03 CD 5 63 4 2017-01-04 DF 61 31 5 2017-01-05 FC 38 3 result <- data.frame(date=c("2017-01-01","2017-01-02", "2017-01-03", "2017-01-04", "2017-01-05"), X1=c("A", "B", "C", "D", "F"), X2=c("B", "A", "D", "F", "C"), Var1=c("3", "2", "5", "61", "38"), Var2=c("6", "4", "63", "31", "3"))
I wanted to use mapvalues, but couldn't figure it out. The second thought was that the long formatting (fusion) with df2 and the attempt then, but also failed.
Okay, here is my best attempt, it just feels like there might be a more efficient way if you need to create several (> 50) new variables for a data frame.
df2.long <- melt(df2, id.vars = c("date")) df$Var1 <- na.omit(merge(df, df2.long, by.x = c("date", "X1"), by.y = c("date", "variable"), all.x = FALSE, all.y = TRUE))[,4] df$Var2 <- na.omit(merge(df, df2.long, by.x = c("date", "X2"), by.y = c("date", "variable"), all.x = FALSE, all.y = TRUE))[,5]