Поиск совпадений между столбцами и внутри строк в R - PullRequest
0 голосов
/ 08 октября 2019

Я работаю с двумя столбцами данных почтового индекса. Один столбец представляет местоположение поиска, а второй столбец представляет местоположение (я) структуры. Я пытаюсь найти совпадение между поисковым почтовым индексом и структурным почтовым индексом. В то время как почтовый индекс поиска всегда будет представлять собой только один почтовый индекс, структура может иметь несколько различных почтовых индексов, связанных с ним, и это число меняется с каждым поиском.

Я пробовал фильтр (df, zip1 == zip2), но это соответствует только тогда, когда есть точное совпадение и только 1 местоположение zip в столбце zip2. Точно так же я пробовал% в%, но это не ограничивает совпадения в строках. Я также попытался разбить Zip2 на 1 отдельный столбец для каждого почтового индекса, связанного с местоположением, но и здесь мне не удалось, потому что число местоположений может варьироваться от 1-300. Я все еще очень начинающий R, и поэтому любая помощь очень ценится.

Спасибо за быстрый ответ. Чтобы улучшить мой вопрос Вот некоторые примеры данных, которые иллюстрируют мою проблему (просто небольшая модификация ответа @ r2evans).

df1 <- data.frame(
  searchzip    = c(11111, 22222, 33333, 44444),
  structurezip = c(111112222233333, 222234444, 3333533333, 44446))

В этом случае у меня будут совпадения в первой строке и3-й ряд, но не другие.

1 Ответ

0 голосов
/ 08 октября 2019

Я думаю, что лучший способ - это сначала сформировать кадр, который соединяет почтовый индекс с одним или несколькими соответствующими почтовыми индексами, а затем 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
...