Say I have the following dataframes:
DF1 <- data.frame("A" = rep(c("A","B"), 18),
"B" = rep(c("C","D","E"), 12),
"NUM"= rep(rnorm(36,10,1)),
"TEST" = rep(NA,36))
DF2 <- data.frame("A" = rep("A",6),
"B" = rep(c("C","D"),6),
"VAL" = rep(c(1,3),3))
*Note: Each unique combination of variables A
and B
in DF2
should have a unique VAL
.
For each row, I would like to replace the NA
in TEST
with the corresponding value of VAL
in DF1
if the values in columns A
and A
match and the values in columns B
and B
match for that row. Otherwise, I'd leave TEST
as NA
. How would I do this without looping through each combination using match?
Ideally, an answer would scale to two data frames with many columns to match upon.
# this is your DF1
DF1 <- data.frame("A" = rep(c("A","B"), 18),
"B" = rep(c("C","D","E"), 12),
"NUM"= rep(rnorm(36,10,1)),
"TEST" = rep(NA,36))
#this is a DF2 i created, with unique A, B, VAL
DF2 <- data.frame("A" = rep(c("A","B"),3),
"B" = rep(c("C","D","E"),2),
"VAL" = rep(1:6))
# and this is the answer of what i assume you want
tmp <- merge(DF1,DF2, by=c("A","B"), all.x=TRUE, all.y=FALSE)
DF1[4] <- tmp[5]