2017-02-04 3 views
-1

Я хотел бы объединить функцию dplyr через каталог csv-файлов. Я знаю, как реализовать команду для одного файла, но было бы полезно сделать это для всего каталога, чтобы ускорить процесс, а также создать выходной файл, содержащий сводные данные для каждого файла, к которому была применена функция ,Примените функцию dplyr ко многим файлам

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

taxa <- file %>% group_by(crop, year) %>% summarise(num_taxa=n_distinct(taxon)) 

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

+1

Если вы не столкнулись с проблемами памяти: прочитайте их все в один файл, используя 'bind_rows (lapply (list.files (wherever), read.csv))'; используйте 'group_by (файл, урожай, год)%>% do_whatever'; затем пишите в один файл. – Frank

+0

Или, добавив к рекомендации Фрэнка, используйте 'do' с функцией записи для записи отдельных файлов. – Gregor

ответ

-2

я такого рода вещи, используя purrr::map() над dplyr::do(), потому что map подход собирается заменить dosomeday.

library(tidyverse) #for dplyr, readr and purrr 

summary <- map2_df(
    list_of_files, 
    names(list_of_files), 
    ~ read_csv(.x) %>% 
     group_by(crop, year) %>% 
     summarise(num_taxa = n_distinct(taxon)) %>% 
     mutate(id = .y)) 

write_csv(summary, name_of_output_file) 

Это создает ваше резюме путем отображения dplyr цепи к list_of_files (.x) и names(list_of_files) (.y). Затем он связывает их вместе и передает вам единый фреймворк с сводкой всех файлов с удобным столбцом идентификаторов для отладки. Вторая строка записывает выходные данные в csv.

+0

Hm. Мне нравится этот подход и ценю предложение, но я получаю следующую ошибку: Ошибка: '.y' не является вектором (NULL). Я использую следующий код: 'list_of_files <-list.files (". ", Pattern =" .csv ") lst <-vector (" list ", length (list_of_files)) summary <- map2_df ( ) LST, имена (ЛСТ), ~ read_csv (.x)%>% group_by (растениеводство, год)%>% реферирования (num_taxa = n_distinct (таксон))%>% мутировать (ID = .y)) write.csv (summary, file = "taxa.csv") ' – RSchaeffer

+0

Просто используйте' list_of_files' и 'names (list_of_files)' вам не нужен 'lst'. Возможно, вам понадобится 'full.names = TRUE' в' list.files() '. –

Смежные вопросы