Я думаю, что лучший способ - это сначала сформировать кадр, который соединяет почтовый индекс с одним или несколькими соответствующими почтовыми индексами, а затем merge
в нем.
Пример данных:
df1 <- data.frame(
searchzip = c(11111, 22222, 33333, 44444),
structurezip = c(11111, 22223, 33335, 44446))
zipmatch <- data.frame(
zip1 = c(11111, 11111, 22222, 22222, 33333, 33333, 33333, 44444, 44444),
zip2 = c(11111, 11112, 22222, 22223, 33333, 33334, 33335, 44444, 44445),
ismatch = TRUE)
Слияние и его результаты:
df1new <- merge(
df1, zipmatch,
by.x = c("searchzip", "structurezip"),
by.y = c("zip1", "zip2"), all.x = TRUE)
df1new
# searchzip structurezip ismatch
# 1 11111 11111 TRUE
# 2 22222 22223 TRUE
# 3 33333 33335 TRUE
# 4 44444 44446 NA
(Если вам удобно, что это делает то, что вы хотите, вы можете просто перезаписать df1
напрямую, вместо того, чтобы использовать новую переменную df1new
.) Вв этом случае операция объединения даст вам TRUE
для известных совпадений и заполнит несопоставленные строки NA
, поэтому мы можем просто заменить это на
df1new$ismatch <- !is.na(df1new$ismatch)
df1new
# searchzip structurezip ismatch
# 1 11111 11111 TRUE
# 2 22222 22223 TRUE
# 3 33333 33335 TRUE
# 4 44444 44446 FALSE
In dplyr
-спик:
library(dplyr)
df1 %>%
left_join(zipmatch, by = c("searchzip" = "zip1", "structurezip" = "zip2")) %>%
mutate(ismatch = !is.na(ismatch))
# searchzip structurezip ismatch
# 1 11111 11111 TRUE
# 2 22222 22223 TRUE
# 3 33333 33335 TRUE
# 4 44444 44446 FALSE