data('diamonds', package = 'ggplot2')
# base
spl_1 <- split(diamonds,
f = list(diamonds$cut, diamonds$color, diamonds$clarity),
sep = '-', drop = TRUE)
# dplyr
spl_2 <- split(diamonds, dplyr::group_indices(diamonds, cut, color, clarity))
microbenchmark::microbenchmark(
"base" = split(diamonds,
f = list(diamonds$cut, diamonds$color, diamonds$clarity),
sep = '-', drop = TRUE),
"dplyr" = split(diamonds, dplyr::group_indices(diamonds, cut, color, clarity))
)
Unit: milliseconds
expr min lq mean median uq max neval
base 20.0393 21.03635 31.81306 23.96895 25.2412 718.0278 100
dplyr 14.5076 15.07760 16.54695 15.73990 16.9229 24.3292 100
但是如果你将拆分数据帧写入许多CSV,那么拥有好的列表元素名称可以更容易地编写适当的文件名,例如
# don't run this unless you want ~300 CSV's in your working dir!
mapply(function(dat, nm) {
write.csv(dat, file.path(getwd(), paste0(nm, '.csv')))
},
dat = spl_1, nm = names(spl_1))
1 回答
如图所示,您的图像中的结果无法通过输入数据计算,但我认为这是因为Excel中的复制粘贴错误 . 你最想要的是
你也可以使用
dplyr::group_indices()
作为(轻微)速度增益的分裂变量,代价是列表元素的漂亮名称:但是如果你将拆分数据帧写入许多CSV,那么拥有好的列表元素名称可以更容易地编写适当的文件名,例如
如果使用dplyr按组索引进行拆分,则必须手动将名称添加到输出列表中
在写入文件之前,这可能会消除任何速度增益 .