Как я могу написать группы 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]