如何将dplyr组写入单独的文件?

时间:2016-12-20 00:32:34

标签: r csv dplyr readr

我正在尝试为与dplyr的group_by函数分组的数据框中的每个组创建单独的.csv文件。到目前为止,我有类似

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

正如所料,这会写一个.csv文件,只包含最后一组的数据。如何修改此文件以编写多个.csv文件,每个文件的文件名包含cyl?

4 个答案:

答案 0 :(得分:13)

您可以将csv写入过程包装在自定义函数中,如下所示。请注意,该函数必须返回     data.frame否则会返回错误Error: Results are not data frames at positions

这将返回名为“mtcars_cyl_4.csv”,“mtcars_cyl_6.csv”和“mtcars_cyl_8.csv”的3个csv文件

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

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

答案 1 :(得分:4)

以下作品(您可以跳过自定义功能)

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

答案 2 :(得分: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]

请注意,生成的表将没有cyl的列(由于它存储在文件名中,因此可能是多余的,但您可能因其他原因而将其保留)。

如果您想将cyl作为列包含在输出中,可以使用

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

答案 3 :(得分:2)

使用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")))