Purrr, write_csv и присвоение имен вещам

#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 помощью like paste0('geocode_output_',basename(.x), '_geocode.csv')