Вот ответ tidyverse / dplyr.
library(tidyverse)
df1 <- data.frame(source = c("Pr1", "Pr2","Pr3"),
date = c("Jan 2018","Feb 2018","Mar 2018"),
Freq = c(100,20,30))
df2 <- data.frame(source = c("Pr1","Pr2","Pr1"),
date = c("Sep 2018","Aug 2018","Jan 2018"),
Freq = c(0,0,0))
df <- full_join(df1,df2,by = c("source","date"))
source date Freq.x Freq.y
1 Pr1 Jan 2018 100 0
2 Pr2 Feb 2018 20 NA
3 Pr3 Mar 2018 30 NA
4 Pr1 Sep 2018 NA 0
5 Pr2 Aug 2018 NA 0
final_df <- df %>%
mutate(Frequency = if_else(is.na(Freq.x), Freq.y, Freq.x)) %>%
select(source, date, Frequency)
source date Frequency
1 Pr1 Jan 2018 100
2 Pr2 Feb 2018 20
3 Pr3 Mar 2018 30
4 Pr1 Sep 2018 0
5 Pr2 Aug 2018 0
Просто обратите внимание на поведение if_else () - он будет сохранять частоту df1, если он равен 0 (не NA).