【问题标题】:How to group_by multiple column, and then split results into a list of data.frame?如何group_by多列,然后将结果拆分为data.frame列表?
【发布时间】:2017-03-29 17:35:22
【问题描述】:

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

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

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

我知道nest 做了几乎相同的事情,但它排除了我曾经嵌套的列(意味着 A 和 B 不在结果数据框中)

我想包含所有列。

编辑:说明照片。

【问题讨论】:

  • split 没有做你想做的事吗?
  • split 不能按多列进行拆分。 dplyr 以速度着称
  • 请分享示例数据和预期输出。
  • 查看split 中的f 参数,了解如何按多列进行拆分。
  • 我已经更新了问题。请检查它

标签: r dataframe split dplyr


【解决方案1】:

您的图像中的结果无法从所示的输入数据计算,但我假设这是因为 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]))

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 2018-09-21
    相关资源
    最近更新 更多