Как я могу написать группы dplyr для отдельных файлов?

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

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

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

3 ответа

Решение

Вы можете обернуть процесс записи 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(.))

С dplyr_0.8.0 это можно сделать с помощью group_by_walk

library(dplyr)
library(readr)
mtcars %>%
   group_by(cyl) %>%
   group_walk(~ write_csv(.x, paste0(.y$cyl, "test.csv")))

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

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

Если вы хотите использовать 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]

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

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

mtcars[, write.csv(c(.BY,.SD), paste0("mtcars_cyl_", .BY, ".csv")), by=cyl]
Другие вопросы по тегам