Я предполагаю, что строка в файле-1 верна, если в файле-2 нет подходящей строки.
Тогда, для приведенного вами примера, это можно сделать в два этапа: (1 ) удаление неправильных строк из файла-1, (2) добавление строк из файла-2.
f1_no_wrong = file1 %>%
anti_join(file2, by = "city")
appended = rbind(f1_no_wrong, f2)
Анти-объединение возвращает каждую строку в LHS, которая не соответствует записи в RHS.
Обратите внимание, что вышеприведенный подход потерпит неудачу, если файл-1 или файл-2 содержат разные столбцы друг от друга (например, в файле-1 есть несколько других столбцов, не включенных в ваш пример выше), которые вы хотите сохранить ).
В этом случае я бы порекомендовал что-то вроде:
joined = f1 %>%
left_join(f2, by = "city", suffix = c("","_true")) %>%
mutate(final_lat = ifelse(is.na(lat_true), lat, lat_true), # keep true value if exists
final_log = ifelse(is.na(log_true), log, log_true)) %>%
select(-lat, -log, -lat_true, -log_true) %>% # discard finished with columns
rename(lat = lat_true, log = log_true) %>%
distinct() # optional, may be required if duplicate wrong values