我试图使用dplyr的group_by函数对数据框进行分组,并创建每个组的独立的.csv文件。目前我有以下代码:
by_cyl <- group_by(mtcars, cyl)
do(by_cyl, write_csv(., "test.csv"))
正如预期的那样,这将编写一个只包含最后一组数据的单个 .csv 文件。我该如何修改它以编写多个 .csv 文件,并且每个文件名都包含cyl?
使用 dplyr_0.8.0
,可以通过group_by
和group_walk
来实现此操作。
library(dplyr)
library(readr)
mtcars %>%
group_by(cyl) %>%
group_walk(~ write_csv(.x, paste0(.y$cyl, "test.csv")))
您可以按照以下方式将csv写入过程包装在自定义函数中。请注意,该函数必须返回一个data.frame
,否则会返回错误Error: Results are not data frames at positions
这将返回3个名为"mtcars_cyl_4.csv"、"mtcars_cyl_6.csv"和"mtcars_cyl_8.csv"的csv文件。
customFun = function(DF) {
write.csv(DF,paste0("mtcars_cyl_",unique(DF$cyl),".csv"))
return(DF)
}
mtcars %>%
group_by(cyl) %>%
do(customFun(.))
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]
mtcars[, write.csv(c(.BY,.SD), paste0("mtcars_cyl_", .BY, ".csv")), by=cyl]
fwrite
替换write.csv
,这是本地data.table
写.csv
的方法。它非常快,因为它可以并行工作。 - rafa.pereirafwrite()
而不是使用 write.csv()
吗?当应用于大型数据集时,前者更快。 - Miao Cai