Вот базовое решение R, использующее merge
+ ifelse
DF <- within(merge(DF1,DF2,by.x = c("ColA","ColB"),by.y = c("ColumnA","ColumnB"),all.x = TRUE),
value <- ifelse(is.na(metric),observation,metric))[-(3:4)]
, такое что
> DF
ColA ColB value
1 123 Text1 7
2 234 Text2 65
3 345 Text3 78