繁体   English   中英

dplyr: colSums on sub-grouped (group_by) 数据帧:优雅

[英]dplyr: colSums on sub-grouped (group_by) data frames: elegantly

我有一个非常大的数据框(265,874 x 30),包含三个合理的组:年龄类别(1-6)、日期(5479 个)和地理区域(共 4 个)。 每条记录都包含一个选项,外加 27 个计数变量。 我想按每个分组变量进行分组,然后对结果子分组的 27 个变量进行 colSums。 我一直在尝试使用dplyr (v0.2) 来做这件事,因为手动执行它最终会设置很多冗余的东西(或者诉诸循环来遍历分组选项,因为缺乏优雅的解决方案) .

示例代码

countData <- sample(0:10, 2000, replace = TRUE)
dates <- sample(seq(as.Date("2010/1/1"), as.Date("2010/01/30"), "days"), 200, replace = TRUE)
locality <- sample(1:2, 2000, replace = TRUE)
ageCat <- sample(1:2, 2000, replace = TRUE)
sampleDF <- data.frame(dates, locality, ageCat, matrix(countData, nrow = 200, ncol = 10))

那么我想做的是......

library("dplyr")
sampleDF %.% group_by(locality, ageCat, dates) %.% do(colSums(.[, -(1:3)]))

但这并不完全有效,因为 colSums() 的结果不是数据框。 如果我投它,它的工作原理:

sampleDF %.% group_by(locality, ageCat, dates) %.% do(data.frame(matrix(colSums(.[, -(1:3)]), nrow = 1, ncol = 10)))

但最后的 do(...) 位似乎很笨重。

关于如何更优雅或更有效地做到这一点的任何想法? 我想问题归结为:如何最好地使用 do() 函数和 . 运算符通过 colSums 汇总数据帧。

注意:do(.) 运算符仅适用于dplyr 0.2,因此您需要从 GitHub(链接)而不是从 CRAN 获取它。

编辑:建议的结果

三种解决方案

  1. 我在帖子中的建议:经过,146.765 秒。

  2. @joran 的建议如下:6.902 秒

  3. @eddi 在评论中的建议,使用 data.table:6.715 秒。

我没有费心去复制,只是使用 system.time() 来获得一个粗略的衡量标准。 从它的外观来看, dplyrdata.table在我的数据集上的表现大致相同,而且在正确使用时,两者都比我昨天提出的 hack 解决方案快得多。

除非我失去了一些东西,这似乎是一个工作summarise_each (几分colwiseplyr模拟):

sampleDF %.% group_by(locality, ageCat, dates) %.% summarise_each(funs(sum))

默认情况下,分组列不包含在汇总功能中,您只能选择列的子集以使用与使用select时相同的技术来应用这些功能。

summarise_eachdplyr的0.2版本,但没有在0.1.3,据我所知)。

这是@joran在2014年的精彩回答。

现在这个方法已被弃用。 相反,请使用summarize_all()summarize_at()

这是@Hack-R 在 2018 年的精彩回答。

现在这种方法已被取代。 相反,请使用summarize() / summarise()结合across() ;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM