首页 文章

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

提问于
浏览
0

假设我有一个数据框如下:

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

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

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

我想要包括所有列 .

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

1 回答

  • 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]))
    

    在写入文件之前,这可能会消除任何速度增益 .

相关问题