С 580 значениями, как вы говорите, проблема больше, чем представленные выше данные, если предоставить только один ZIP и один город.
Я бы предложил объединить каждый столбец вашего фрейма данных после созданиязавершить кейс, а затем получить уникальные полные строки, используя distinct
:
library(tidyverse)
df_2 <- df %>%
filter(complete.cases(city, zipcode)) %>%
merge(select(df, city), by = "city", all.x = TRUE) %>%
merge(select(df, zipcode), by = "zipcode") %>%
distinct(city, zipcode)
из примера представительства, это оставляет только одну строку, но с 580 строками я предполагаю, что у вас есть более одного города и один ZIPкод.