如何编写 dplyr 组来分隔文件?
How can I write dplyr groups to separate files?
我正在尝试为使用 dplyr 的 group_by 函数分组的数据框中的每个组创建单独的 .csv 文件。到目前为止,我有类似
by_cyl <- group_by(mtcars, cyl)
do(by_cyl, write_csv(., "test.csv"))
正如预期的那样,这将写入一个仅包含最后一组数据的 .csv 文件。我如何修改它以写入多个 .csv 文件,每个文件的文件名都包含 cyl?
您可以将 csv 写入过程包装在自定义函数中,如下所示。请注意,函数必须 return
data.frame
否则它 return 是一个错误 Error: Results are not data frames at positions
这将 return 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(.))
如果您愿意使用 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]
请注意,生成的 table 将没有 cyl 列(这将是多余的,因为它存储在文件名中,但您可能出于其他原因想要将其保留)。
如果您希望将 cyl 作为列包含在输出中,您可以使用
mtcars[, write.csv(c(.BY,.SD), paste0("mtcars_cyl_", .BY, ".csv")), by=cyl]
以下作品(自定义功能可跳过)
library(dplyr)
library(readr)
group_by(mtcars, cyl) %>%
do(write_csv(., paste0(unique(.$cyl), "test.csv")))
使用 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")))
我正在尝试为使用 dplyr 的 group_by 函数分组的数据框中的每个组创建单独的 .csv 文件。到目前为止,我有类似
by_cyl <- group_by(mtcars, cyl)
do(by_cyl, write_csv(., "test.csv"))
正如预期的那样,这将写入一个仅包含最后一组数据的 .csv 文件。我如何修改它以写入多个 .csv 文件,每个文件的文件名都包含 cyl?
您可以将 csv 写入过程包装在自定义函数中,如下所示。请注意,函数必须 return
data.frame
否则它 return 是一个错误 Error: Results are not data frames at positions
这将 return 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(.))
如果您愿意使用 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]
请注意,生成的 table 将没有 cyl 列(这将是多余的,因为它存储在文件名中,但您可能出于其他原因想要将其保留)。
如果您希望将 cyl 作为列包含在输出中,您可以使用
mtcars[, write.csv(c(.BY,.SD), paste0("mtcars_cyl_", .BY, ".csv")), by=cyl]
以下作品(自定义功能可跳过)
library(dplyr)
library(readr)
group_by(mtcars, cyl) %>%
do(write_csv(., paste0(unique(.$cyl), "test.csv")))
使用 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")))