如何group_by多列,然后将结果拆分为data.frame列表?

时间:2017-03-29 17:35:22

标签: r dataframe split dplyr

假设我的数据框如下:

A | B | C | D | E
-----------------
* | * | * | * | *

我想通过列A和B的唯一值将DF拆分为多个部分,并将每个部分存储为结果列表的项目(以导出到.csv文件)

我知道nest几乎完全相同,但它排除了我用来嵌套的列(意味着A和B不在结果数据框中)

我想要包含所有列。

编辑:说明照片。 enter image description here

1 个答案:

答案 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]))

在写入文件之前,这可能会消除任何速度提升。