Более быстрый способ фильтрации ошибок префикса почтового индекса с помощью dplyr - PullRequest
1 голос
/ 05 марта 2020

У меня есть набор данных с почтовым индексом и столбцами состояния (среди прочих). Он большой, но не ужасный (4M строк, 70 столбцов), но для фильтрации ошибочных наблюдений требуется целая вечность. В частности, я пытаюсь отбросить наблюдения, когда почтовый индекс не совпадает с состояниями (например, почтовые индексы Нью-Джерси начинаются с 0, но многие почтовые индексы в данных начинаются с 7). Вот мой нынешний подход, но я считаю, что должен быть более быстрый способ. Будем очень благодарны за любые предложения!

df_clean <- df_tmp %>%  
  filter(!(startsWith(zip, c("7", "8")) & state == "NJ")) %>%
  filter(!(startsWith(zip, c("0", "1")) & state == "FL")) %>%
  filter(!(startsWith(zip, "4") & state == "ME")) %>%
  filter(!(startsWith(zip, c("1", "2")) & state == "MA")) %>%
  filter(!(startsWith(zip, "6") & state == "CT")) 

Я надеюсь, что это само за себя, но дайте мне знать, будет ли полезен пример набора данных. Спасибо!

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вот более программный c подход, который включает в себя создание таблицы поиска с правильным начальным значением di git по состоянию, объединение ее с вашими данными и удаление всех строк, где начальный di git не совпадает ожидаемое ди git для этого состояния.

digits_by_state <- data.frame(state = c("NJ", "FL", "ME", "MA", "CT"), 
                              correct_digit = c(0,3,0,0,0))

df_clean <- df_tmp %>%
  mutate(starting_digit = as.integer(substr(zip, 1, 1))) %>%
  left_join(digits_by_state) %>%
  filter(starting_digit == correct_digit)
1 голос
/ 05 марта 2020

Проблема в том, что если размер информационного кадра велик, каждый фильтр удалит его часть, а затем передаст все еще большой набор данных следующему фильтру, чтобы он работал медленнее.

Если вы могли бы объединить все ваши условия в одном выражении фильтра, это будет работать намного быстрее. Например:

df_clean <- df_tmp %>%  
  filter(
    !(startsWith(zip, c("7", "8")) & state == "NJ") |
    !(startsWith(zip, c("0", "1")) & state == "FL") |
    !(startsWith(zip, "4") & state == "ME") |
    !(startsWith(zip, c("1", "2")) & state == "MA") |
    !(startsWith(zip, "6") & state == "CT")
  )

Не пытайтесь окружить выражения & с помощью () перед |, потому что | в любом случае имеет более низкий приоритет. Таким образом, ваши выражения станут более читабельными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...