2016-12-20 3 views
5

Я пытаюсь создать отдельные .csv-файлы для каждой группы в фрейме данных, сгруппированном с функцией group_by dplyr. До сих пор у меня есть что-то вродеКак написать группы dplyr для разделения файлов?

by_cyl <- group_by(mtcars, cyl) 
do(by_cyl, write_csv(., "test.csv")) 

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

ответ

10

Вы можете обернуть процесс записи csv в пользовательскую функцию следующим образом. Обратите внимание, что функция должна возвращать в data.frame еще он возвращает ошибку Error: Results are not data frames at positions

Это будет возвращать 3 CSV файлы с именем «mtcars_cyl_4.csv», «mtcars_cyl_6.csv» и «mtcars_cyl_8.csv»

customFun = function(DF) { 
write.csv(DF,paste0("mtcars_cyl_",unique(DF$cyl),".csv")) 
return(DF) 
} 

mtcars %>% 
group_by(cyl) %>% 
do(customFun(.)) 
+0

Именно то, что мне было нужно! В стороне - в моем фактическом случае я группировался по двум переменным; получается порядок, которым вы их группируете, действительно важно. Например, «цил» должен быть первой группировкой для этого. – Nat

+0

Красивая обертка для функций! Спасибо! – spacedSparking

2

Если вы были готовы использовать data.table, то это немного менее неуклюжий способ сделать это.

require(data.table) 
# Because this is a built in table we have to make a copy first 
mtcars <- mtcars 
setDT(mtcars) # convert the data into a data.table 

mtcars[, write.csv(.SD, paste0("mtcars_cyl_", .BY, ".csv")), by = cyl] 

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

Если вы хотите цил быть включены в выходные данные в виде столбца можно использовать

mtcars[, write.csv(c(.BY,.SD), paste0("mtcars_cyl_", .BY, ".csv")), by=cyl] 
+0

Вы получаете сообщение об ошибке, если вы конвертируете одну из встроенных таблиц в таблицу data.table, не копируя ее в первую очередь. Вот ошибка, которую вы получаете «Ошибка в setDT (mtcars): Невозможно преобразовать« mtcars »в data.table по ссылке, потому что привязка заблокирована. Очень вероятно, что« mtcars »находится внутри пакета (или среды), который заблокирован для предотвращения изменения привязок переменных. Попробуйте скопировать объект в текущую среду, например: var <- copy (var), а затем снова использовать setDT. " –

+0

К сожалению, это так. Мой плохой –

+0

Спасибо за предложения Rich. –

1

следующие работы (вы можете пропустить пользовательскую функцию)

library(dplyr) 
library(readr) 
group_by(mtcars, cyl) %>% 
    do(write_csv(., paste0(unique(.$cyl), "test.csv"))) 
+0

Я получаю это «Ошибка: результаты не являются кадрами данных в позициях: 1, 2, 3, 4, 5, 6, 7», а ответ by @OdeToMyFiddle работает. – val

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