#r #tidyverse #geocoding
#r #tidyverse #геокодирование
Вопрос:
Это был многоступенчатый процесс, поэтому позвольте мне попытаться объяснить, что происходит…
Я работаю над записью около 2000 файлов в csv. Это проект геокодирования, и я решил использовать tidygeocoder, который, к сожалению, приводит к ошибке тайм-аута с некоторой частотой, но он достаточно хорошо работает в моем рабочем процессе.
Первым процессом было считывание различных файлов из csv и присвоение им имен. Просто тестирую первые 4 файла, чтобы я правильно понял процесс.
Передаем 4 имени файлов в read_csv, затем задаем имена, наконец, в каждом файле есть столбец Combine_Address, который я использую для геокодирования. Опять никаких проблем. Однако последняя проблема заключается в именовании.
Каждый из четырех файлов должен иметь уникальное имя, но я постоянно заканчиваю с сообщением об ошибке
Ошибка в stream_delim_(df, path, …, bom = bom, quote_escape = quote_escape): недопустимое соединение
что стало результатом обоих этих действий…
- write_csv(путь = здесь(«excel_output», «geocode_output», paste0(имена (.x),»_geocode.csv»))))
и
- write_csv(путь = здесь(«excel_output», «geocode_output», glue(«{names(.x)}_geocode.csv»))))
# Loop geocode over .csv and export -------------------
files_to_read <- str_subset(list.files(here("excel_output", "csv_output"),
pattern = ".csv$", full.names = T),
".csv")
file_names <- str_subset(list.files(here("excel_output", "csv_output"),
pattern = ".csv$"),
".csv") %>%
str_remove(., ".csv")
files_to_read[1:4] %>%
map(~read_csv(.x)) %>%
set_names(nm = file_names[1:4]) %>%
walk(~.x %>%
geocode(Combine_Address) %>%
write_csv(path = here("excel_output", "geocode_output", "_geocode.csv")))
Приведенный выше код работает хорошо, но выводит только один именованный файл «_geocode.csv», но paste0 и glue привели к ошибкам в коде. В недоумении, что теперь попробовать. Любая информация будет с благодарностью принята.
Ответ №1:
Вы можете сделать это за один map
вызов. Попробуйте :
library(readr)
files_to_read[1:4] %>%
purrr::map(~read_csv(.x) %>%
geocode(Combine_Address) %>%
write_csv(sprintf('geocode_output_%s_geocode.csv', basename(.x))))
Комментарии:
1. Отлично, это сработало очень хорошо !… хотя, что делает sprintf? Я видел, как это всплывало несколько раз во время изучения проблемы, но справочная документация не очень полезна
2.
sprintf
похоже на,paste0
но, я думаю, оно более краткое, поскольку, какglue
и вы, вы можете указать заполнитель между строкой. Вы могли бы написать то же самое сpaste0
помощью likepaste0('geocode_output_',basename(.x), '_geocode.csv')