假设我的数据框如下:
A | B | C | D | E
-----------------
* | * | * | * | *
我想通过列A和B的唯一值将DF拆分为多个部分,并将每个部分存储为结果列表的项目(以导出到.csv文件)
我知道nest
几乎完全相同,但它排除了我用来嵌套的列(意味着A和B不在结果数据框中)
我想要包含所有列。
答案 0 :(得分:0)
无法从所示的输入数据计算图像中的结果,但是我认为这是由于Excel中的复制粘贴错误。您最可能想要的是
split(data, f = list(data$cat1, data$cat2), drop = TRUE)
您还可以将dplyr::group_indices()
用作拆分变量,以(略微)提高速度,但会浪费列表元素的漂亮名称:
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))
如果使用dplyr按组索引划分,则必须使用
之类的名称手动将名称添加到输出列表中names(spl_2) <- sapply(spl_2, function(x)
paste0(x$cut[1], '-', x$color[1], '-', x$clarity[1]))
在写入文件之前,这可能会消除任何速度提升。